summaryrefslogtreecommitdiff
path: root/Master/texmf-dist
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-11 23:55:17 +0000
committerKarl Berry <karl@freefriends.org>2006-01-11 23:55:17 +0000
commite08f48b035595504bc016c9a60c01ae4de11ec58 (patch)
treee37fd4a0a88d521bc595cf9abf0936042e677961 /Master/texmf-dist
parentcbb5b546b243656f0600320003ea910bb0515e08 (diff)
trunk/Master/texmf-dist/source/latex/msg
git-svn-id: svn://tug.org/texlive/trunk@396 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r--Master/texmf-dist/source/latex/msg/msg.dtx1466
-rw-r--r--Master/texmf-dist/source/latex/msg/msg.ins23
-rw-r--r--Master/texmf-dist/source/latex/msg/msgfiles.dtx97
3 files changed, 1586 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/msg/msg.dtx b/Master/texmf-dist/source/latex/msg/msg.dtx
new file mode 100644
index 00000000000..341cf05114b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/msg/msg.dtx
@@ -0,0 +1,1466 @@
+% \iffalse meta-comments
+% msg.dtx original file name. This is a 8bits file.
+%
+% Copyright (C) 2004 LPPL - Bernard Gaulle.
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License as of http://www.latex-project.org/lppl.txt
+%
+% This file has the LPPL maintenance status "maintained".
+% The current maintainer is Bernard.Gaulle at idris.fr
+% \fi
+% \CheckSum{1278}
+% \iffalse
+% \begin{macrocode}
+%<*README>
+%%
+%% HERE IS THE MSG PACKAGE FOR LaTeX
+%%
+%% A LaTeX package to localize any package or document class.
+%%
+%% A LaTeX package able to issue messages in the language provided as option
+%% of \documentclass or in use in the document (\languagename). All messages
+%% are identified with a unique "id" and stored in a MessagesFile whose name
+%% is related to the package and optionnaly to the language.
+%%
+%% MessagesFile, name: [<language>]_<package>-msg.tex
+%% contents: \msg{<id>}{<message>} % defines the message "id".
+%% \msg*{<id>}{<message>} % star form for msg emphasis.
+%% \msg{*}{<error message>} % bad "id" default message.
+%% Messages can have 3 more parts defined asis:
+%% \msg{<id>}{<msg>}[ % defines the msg first part.
+%% \msgparti{<msg_part>} % defines the msg second part.
+%% \msgpartii{<msg_part>} % defines the msg third part.
+%% \msgpartiii{<msg_part>}] % defines the msg fourth part.
+%% Any message part can include a |#1| parameter provided from any
+%% of the macros below.
+%% Error messages have just a help more part as follows:
+%% \msg{<id>}{<msg>}[ % defines the msg first part.
+%% \help{<help_part>}] % defines the help part.
+%% All messages should be fully expandable.
+%% Custolization:
+%% \msgheader{<head part of messages>}
+%% \msgtrailer{<final part of messages>}
+%% \msgencoding{<encoding of messages>}% as for inputenc.
+%% Check "msg-msg.tex" file for msg's own messages file.
+%%
+%% Document usage: \documentclass[any_option]{any_class}
+%% call: \usepackage[options,language]{msg}
+%%
+%% to issue the message "id": \issuemsg{<id>}(<package>)[#1]
+%% One can use any message macro (defaultly \typeout) with:
+%% \issuemsg[msg_macro]{<id>}(<package>)[#1]
+%% Multi-parts message can't be issued through \issuemsg.
+%% One can specify the macro name to issue message as an option
+%% of \usepackage: \message, \wlog, \typeout, \kbtypyeout or
+%% \ClassWarning, \ClassError, \PackageWarning, \PackageError, ...
+%%
+%% to retrieve the message "id" in \themsg (without typesetting):
+%% \retrievemsg{<id>}(<package>)[#1]
+%% Multi-parts message will have defined also \themsgi,
+%% \themsgii and \themsgiii.
+%% to get the message "id": \getmsg{<id>}(<package>)[#1]
+%%
+%% Usually, the requested message "id" is retrieved from
+%% [<language>]_<package>-msg.tex but if there is no active language
+%% or if file don't exist then message is searched in the
+%% <package>-msg.tex file.
+%%
+%% For testing a messages file, you can code:
+%% \issueallmsg[msg_macro](<package>)
+%% and all messages from the file will be retrieved and issued.
+%%
+%</README>
+% \end{macrocode}
+% \fi
+% \catcode`\<=\active\def<{$\langle$}
+% \catcode`\>=\active\def>{$\rangle$}
+% \def\msgname{``\textsf{msg}''}
+% \title{The \LaTeXe\ \msgname\ package\\
+% for package localization\thanks{This file has version
+% \fileversion\ last revised \filedate}}
+% \author{Bernard \textsc{Gaulle}}
+% \date{As of \filedate
+% \vfill{\small\tableofcontents}}
+% \maketitle
+%
+% \section{Introduction}
+%
+% Since a \LaTeX\ package issues various messages, mostly in English (but,
+% unfortunately, often in an English-like language), it is usefull
+% to provide a feature to localize any \LaTeXe\ package or document class.
+% The \msgname\ package is designed for that.
+% Messages are in dedicated files and retrieved when needed.\\
+% \textbf{This is a preliminary release} for the packages programmers;
+% \textbf{feel free to send evaluation or bug reports and even
+% corrections or improvements} at |<gaulle@idris.fr>|;
+% i will coordinate the changes.
+% \StopEventually{}
+%
+% \section{The documentation driver}
+%
+% This code will generate the documentation. Since it is the first piece of
+% code in the file, the documentation can be obtained by simply processing
+% this file with \LaTeXe.
+%
+% We just load the \msgname\ package for self testing purposes (which needs
+% we keep track of the |doc|'s |\MakePercent| macros later used).
+% \begin{macrocode}
+%<*driver>
+\documentclass[10pt]{ltxdoc}
+ \makeatletter
+ \let\msg@MPC\MakePercentComment
+ \let\msg@MPI\MakePercentIgnore
+ \makeatother
+ \usepackage[T1]{fontenc}
+ \usepackage{lmodern,makeidx}
+ \usepackage[tracefiles]{msg}
+% \usepackage{msg}% should also be tested without "tracefiles"
+ \begin{document}
+ \DocInput{msg.dtx}
+ \end{document}
+%</driver>
+% \end{macrocode}
+%
+% \section{Initialization}
+%
+% Check if the msg package is already loaded and if yes end input.
+% Set the ``catcode'' for |@| if not already done.
+% Assume defaultly that the output macro (|\issuemsgio|)
+% will be |\typeout| if not already initiated. Force the \texttt{inputenc}
+% package to be loaded, if not already done and even from a Babel option
+% since it could issue messages via our \msgname\ package.
+%
+% \begin{macrocode}
+%<*code>
+\iffalse checksum part
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% checksum = "54410 1466 6398 61162"
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\fi
+\def\fileversion{V0.20}\def\filedate{2005/01/24}%
+\ifx\issuemsg\undefined\else\expandafter\endinput\fi%
+\ifnum\catcode`\@=11\else\expandafter\catcode`\@=11\fi%
+\ifx\LdfInit\@undefined% We need inputenc package.
+ \RequirePackage{inputenc}% Usually, load that package.
+\else% But with Babel, dont use \usepackage or such,
+ \let\@msg@tempa\@currname% Save current package name.
+ \xdef\@currname{inputenc}% set package req.
+ \@@input inputenc.sty% and input it now.
+ \makeatletter%
+ \let\@currname\@msg@tempa% Reset original package name.
+\fi%
+% \end{macrocode}
+% \begin{macro}{\issuemsgio}
+% \begin{macrocode}
+\ifx\issuemsgio\undefined\let\issuemsgio\typeout\fi%
+% \end{macrocode}\label{msgio}
+% \end{macro}
+%
+% Verify that |\languagename| which is
+% set by \texttt{babel} or \texttt{mlp} or \texttt{frenchpro}
+% or \texttt{frenchle} or \ldots
+% is not a virtual language such as
+% |dummy| or |nohyphenation| and then keep it as
+% the \msgname\ package's language name.
+%
+% \begin{macrocode}
+\def\@msg@tempa{dummy}%
+\def\@msg@tempb{nohyphenation}%
+\def\@msg@tempc{english}% Default language for msg package.
+\ifx\languagename\@msg@tempa\else%
+ \ifx\languagename\@msg@tempb\else%
+ \ifx\languagename\@msg@tempc\let\msg@languagename\undefined\else
+ \ifx\languagename\undefined\let\msg@languagename\undefined%
+ \else\edef\msg@languagename{\languagename}% Set it for now.
+ \fi%
+ \fi%
+ \fi%
+\fi%
+% \end{macrocode}
+% \begin{macro}{\packagewarningheader}|#1|
+% This code is designed to localize text of macro |\PackageWarning| which
+% we, now, redefine.
+%
+% \begin{macrocode}
+\def\packagewarningheader#1{Package #1 Warning: }%
+%
+\renewcommand{\PackageWarning}[2]{\GenericWarning{(#1)%
+ \@spaces\@spaces\@spaces\@spaces}%
+ {\packagewarningheader{#1}#2}%
+ }
+% \end{macrocode}
+% \end{macro}\label{pw}
+%
+% Few other internal \LaTeX\ macros might be localized here... but preferably
+% within the kernel.
+%
+% \begin{macrocode}
+\edef\@msg@code@ast{\the\catcode`\*}% Save the current catcode of ``*''.
+% \end{macrocode}
+%
+% \section{Macros to be used in a \LaTeX\ package}
+%
+% Basically, three macro commands can be coded for package localization:
+% |\issuemsg|, |\getmsg| and |\retrievemsg|.
+% Another macro, |\issuemsgx| is given for specific cases, we will see
+% that later, page \pageref{encodings}.
+%
+% \subsection*{Output a message}
+%
+% Here is the main macro which will issue a message ``id'' via the
+% command |\issuemsgio| defaultly set to |\typeout| (cf page~\pageref{msgio}).
+% \begin{macro}{\issuemsg}|[#1]#2(#3)[#4]|
+% \begin{macro}{\issuemsgx}|[#1]#2(#3)[#4]|
+% \begin{macrocode}
+\def\issuemsg{\@ifnextchar[{\i@suemsg}{\i@suemsg[\issuemsgio]}%]
+ }%
+\def\issuemsgx{\@ifnextchar[{\i@suemsgx}{\i@suemsgx[\issuemsgio]}%]
+ }%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% One can provide another command to issue the message
+% by the way of the first optional argument. The second argument is the
+% message ``id''; the third is the name of the package (or document
+% class\footnote{Each time we are talking about a \LaTeX\ package, please
+% consider it applies also to any \LaTeX\ document class.}
+% which provides that message through a
+% message file whose name is |[language_]package-msg.tex|. Lastly an optional
+% parameter can be set to ``|#1|\footnote{You can put here
+% any replacement text instead of this \texttt{\#1} parameter. Be carefull,
+% this parameter or replacement text will be, usually, expanded; so
+% protect any string which should not with a \texttt{\textbackslash string}
+% prefix.}'' to forward an argument
+% directly inside the message content. I thought the syntax would be too
+% much complicated to offer much more parameters through that mean.
+% We will see later that the message can also be split in four parts,
+% allowing anyone to display the message differently but no as
+% |\issuemsg| does.
+%
+% \begin{center}
+% \fbox{{\texttt{\textbackslash issuemsg[<\emph{message\_macro}>]\{<\emph{id}>\}(<\emph{package}>)[\#1]}}}
+% \end{center}
+%
+% The message macro could be the usual |\typeout| or any other output macro
+% with one argument such as |\message| or |\wlog|.
+% You can also code a macro with two arguments, such as |\ClassWarning|,
+% |\ClassWarningNoLine|, |\PackageWarning|, |\PackageWarningNoLine|
+% |\ClassInfo| or |\PackageInfo| which have just a name as first argument,
+% like this:
+%
+% \begin{center}
+% \fbox{{\texttt{\textbackslash issuemsg[<\emph{message\_macro\{arg1\}}>]\{<\emph{id}>\}(<\emph{package}>)[\#1]}}}
+% \end{center}
+% That way the first argument is not localized (usually this is a class or
+% package name) and the second argument is provided by the message file
+% entry and so localized.
+%
+% You can also use special error macros with 3 arguments as explained below.
+%
+% \subsection*{Willing to issue a \texttt{\textbackslash PackageError}?}
+% \label{willingPE}
+%
+% The \msgname\ package is designed for basic macro messages which have
+% just only one text argument to localize.
+% The |\PackageError| is one exception; it has
+% 3 arguments: the first one (name of package in error:
+% |<|\texttt{\emph{package1}}|>|) which is given as the following:
+%
+% \begin{center}
+% \fbox{{\texttt{\textbackslash issuemsg[\textbackslash PackageError\{<\emph{package1}>\}]\{<\emph{id}>\}(<\emph{package2}>)[\#1]}}}
+% \end{center}
+%
+% \noindent the other two arguments will be retrieved from the message file
+% of \texttt{<\emph{package2}>} and localized.
+%
+% The same coding can be used for |\ClassError|:
+%
+% \begin{center}
+% \fbox{{\texttt{\textbackslash issuemsg[\textbackslash ClassError\{<\emph{class1}>\}]\{<\emph{id}>\}(<\emph{class2}>)[\#1]}}}
+% \end{center}
+%
+% \subsection*{Examples \& tests\\
+% (using the message files listed page \pageref{msgfiles})}
+% |\issuemsg1(msg)| will give at the console: \\
+% \centerline{\tt\getmsg1(msg)} but
+% |\issuemsg01(msg)| will give: \retrievemsg01(msg){\tt\themsg}.
+%
+% While defining |\def\test#1{`\issuemsg4(msg)[#1]'}| the following call
+% |\emph{\test{SPECIAL}}| will print: \def\test#1{`\getmsg4(msg)[#1]'}\\
+% \centerline{\emph{\test{SPECIAL}}} showing that the argument
+% was inserted inside the message at the exact area, replacing |#1|.
+%
+% In a French document, the same codes will issue:\\
+% \bgroup\makeatletter\@msgINfrench\def\msg@languagename{french}
+% \centerline{\tt\getmsg1(msg)}
+% \centerline{\retrievemsg01(msg){\tt\themsg}}
+% \centerline{\emph{\test{SPECIAL}}}
+% \egroup
+%
+% \begin{macrocode}
+\let\@msgalspace\space%
+\def\@msgalign#1{\ifx\empty#1\else\expandafter\@msgalign@%
+ \expandafter#1\fi}%
+\def\@msgalign@#1{\ifx\void#1\else\expandafter\@msgalign@@%
+ \expandafter#1\fi}%
+\def\@msgalign@@#1{\ifx\protect#1\expandafter\@msgalign@@@%
+ \else\expandafter\@msgalign@@@@%
+ \fi}%
+\def\@msgalign@@@{\@msgalign}%
+\def\@msgalign@@@@{\@msgalspace\@msgalign}%
+\let\msg@cmd\relax%
+\def\i@suemsg{\let\msg@cmd\issuemsg\i@suemsgx}%
+\def\i@suemsgx[#1]#2(#3){\@ifnextchar[{\i@@uemsg[#1]#2(#3)}%]
+ {\i@@uemsg[#1]#2(#3)[]}%
+ }%
+\let\if@msg@pkg@error\iffalse% Defaultly, not an error macro message.
+\def\i@@uemsg[#1]#2(#3)[#4]{%
+ \def\@argmsg{#4}%
+ \def\@msg@iocmd{#1}%
+ \def\@msg@txt{%
+ \themsg\themsgi\themsgii\themsgiii%
+ }%
+ \let\@msg@MBori\MessageBreak%
+ \ifx\MessageBreak\relax%
+ \def\MessageBreak{^^J\expandafter\@msgalign\msg@header\void}%
+ \fi%
+% \end{macrocode}
+%
+% There is a different expansion when basic \TeX\ control sequence are
+% given as the output macro since they require the argument token should
+% begin and end with a brace.
+%
+% \begin{macrocode}
+\def\@msg@tempa{#1}% TeX cs requires {arg}:
+\def\@msg@tempb{\message}%
+\ifx\@msg@tempa\@msg@tempb%
+ \def\@msg@txt{{%
+ \themsg\themsgi\themsgii\themsgiii%
+ }}%
+\fi%
+\def\@msg@tempb{\errmessage}%
+\ifx\@msg@tempa\@msg@tempb%
+ \def\@msg@txt{{%
+ \themsg\themsgi\themsgii\themsgiii%
+ }}%
+\fi%
+% \end{macrocode}
+%
+% Here, we check for error macros and, if any, set the flag for
+% further processing.
+%
+% \begin{macrocode}
+ \let\@msg@txt@\empty%
+ \def\@msg@tempb##1##2/{\let\@msg@tempb=##1}%
+ \def\@msg@tempa{\let\if@msg@pkg@error\iftrue}%
+ \@msg@tempb#1/% \PackageError is a special case with
+ \ifx\@msg@tempb\PackageError% package name and msg+help.
+ \@msg@tempa% Keep it in mind for \@msgparts.
+ \fi%
+% \end{macrocode}
+%
+% Now we test if the output macro name provided is well defined ; if not
+% we retrieve our own message \#1 in place of requested one, otherwise
+% we call the |\retrievemsg| macro and output the message text parts.
+%
+% \begin{macrocode}
+ \ifx\@msg@tempb\ClassError% The same for \ClassError.
+ \@msg@tempa%
+ \fi%
+ \ifx\undefined#1\retrievemsg2(msg)%
+ \PackageWarning{msg}\@msg@txt%
+ \else\retrievemsg#2(#3)[#4]%
+ \edef\@msg@txt{\@msg@txt}%
+ \edef\@msg@txt@{\@msg@txt@}%
+ \@relaxORgobble\@msg@iocmd{\@msg@txt}{\@msg@txt@}%
+ \fi%
+ \let\MessageBreak\@msg@MBori%
+ }%
+% \end{macrocode}
+%
+% \subsection*{Get a message for typesetting}
+%
+% Sometimes we only want to get the message and typeset it. The syntax is
+% the same as |\issuemsg| except there is no first optional argument for
+% providing the macro name to issue the message since it is not issued at all.
+%
+% \begin{center}
+% \fbox{{\texttt{\textbackslash getmsg\{<\emph{id}>\}(<\emph{package}>)[\#1]}}}
+% \end{center}
+% \subsection*{Examples \& tests}
+% |`\textsl{\getmsg1(msg)}'| will insert at this point
+% for typesetting the message: `\textsl{\getmsg1(msg)}';
+% nothing is issued at the console nor in the
+% log, except if the |<|\emph{id}|>| is not found in the message file.
+%
+% In a French document, the same code will issue:
+%
+% \bgroup\makeatletter\def\msg@languagename{french}
+% \centerline{`\textsl{\getmsg1(msg)}'}
+% \egroup
+%
+% Here is the very simple code for |\getmsg|; just a |\retrievemsg| and
+% the expansion of the message when correctly retrieved.
+%
+% \begin{macro}{\getmsg}|#1(#2)[#3]|
+% \begin{macrocode}
+ \def\getmsg#1(#2){\@ifnextchar[{\g@tmsg#1(#2)}{\g@tmsg#1(#2)[]}%]
+ }%
+ \def\g@tmsg#1(#2)[#3]{\retrievemsg{#1}(#2)[#3]\@relaxORgobble%
+ \themsg}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection*{The message file input routine}\label{readingprocess}
+%
+% To avoid having superfluous file names listed in the \texttt{log}
+% each time we request a message from a file, defaultly we read the
+% file with the \TeX\ |\read| command, as the following.
+% This code will not be used when the option |tracefiles| is given (in
+% which case we will input the message file with an usual |\input| macro).
+% \label{readcode}
+%
+% \begin{macrocode}
+ \newif\if@msg@more%
+ \def\@msglineparse#1#2\void{\def\@msg@tempa{\msg}%
+ \def\@msg@tempb{#1}%
+ \ifx\@msg@tempa\@msg@tempb%
+ \@msg@tempf% Execute the previous line.
+ \def\@msg@tempf{}% Start a new one.
+ \if@msg@more% Continue line feed.
+ \def\@msg@tempf{\protect#1#2}%
+ \fi%
+ \else%
+ \let\msgheaderOLD\msgheader%
+ \let\msgtrailerOLD\msgtrailer%
+ \let\msgencodingOLD\msgencoding%
+ \let\spaceOLD\space%
+ \def\msgheader{\protect\msgheader}%
+ \def\msgtrailer{\protect\msgtrailer}%
+ \def\msgencoding{\protect\msgencoding}%
+ \def\space{\protect\space}%
+ \def\help{\protect\helpi}%
+ \protected@edef\@msg@tempf{\@msg@tempf\@msgline}%
+ \let\space\spaceOLD%
+ \let\msgheader\msgheaderOLD%
+ \let\msgtrailer\msgtrailerOLD%
+ \let\msgencoding\msgencodingOLD%
+ \let\spaceOLD\undefined%
+ \let\msgheaderOLD\undefined%
+ \let\msgtrailerOLD\undefined%
+ \let\msgencodingOLD\undefined%
+ \fi%
+ }%
+% \end{macrocode}
+%
+% NOTICE: all messages read until the requested one (included) are expanded
+% (before parsing) in the following macro. Thus, each (|\msg|) macro call
+% should contain significant value or |\protect| a macro. The same reason
+% applies to |\msgheader| and |\msgtrailer| we will defined later (cf
+% p~\pageref{msgtrailerdef}).
+%
+% \begin{macrocode}
+ \newread\@inputmsg%
+ \def\@@input@msg@filename{% Doing nearly like \@@input\msg@filename
+ \openin\@inputmsg=\msg@filename\@msg@moretrue%
+ \let\msgparti\relax%
+ \let\msgpartii\relax%
+ \let\msgpartiii\relax%
+ \def\@msg@tempf{}%
+ \let\endinputORI\endinput%
+ \let\endinput\undefined% To avoid redef info msg.
+ \DeclareRobustCommand*{\endinput}{\@msg@morefalse%
+ }%
+ \let\reserved@a\@gobble% Clean remaining code.
+ \loop\catcode`\#=\active%
+ \endlinechar=-1%
+ \read\@inputmsg to \@msgline%
+ \endlinechar`\^^M%
+ \catcode`\#=6%
+ \ifx\@msgline\empty\else%
+ \expandafter\@msglineparse\@msgline\void%
+ \fi%
+ \ifeof\@inputmsg\@msg@morefalse\fi%
+ \if@msg@more\repeat%
+ \closein\@inputmsg\@msg@tempf%
+ \catcode`\#=6%
+ \let\endinput\endinputORI%
+ }%
+\def\@msginput@usual{\let\endinputORI\endinput\@@input\msg@filename}%
+% \end{macrocode}
+%
+%
+% \subsection*{Just retrieve \texttt{\textbackslash themsg}}
+%
+%
+% One can also want to retrieve the message from the file and save
+% it in a macro for later use.
+% In fact, if this is a one-part message it will be saved
+% in |\themsg|, otherwise this will be the first part message and other parts
+% will be saved in |\themsgi|, |\themsgii| and |\themsgiii|.
+% This will be achieved via the |\retrievemsg| macro defined as the
+% following:
+%
+% \begin{macro}{\retrievemsg}|#1(#2)[#3]|
+% \begin{macrocode}
+ \def\retrievemsg#1(#2){\catcode`\*=\@msg@code@ast%
+ \@ifnextchar[{\r@trievemsg#1(#2)}%]
+ {\r@trievemsg#1(#2)[]}%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \let\msg@empty\empty%
+ \let\if@msgnext\iffalse% Set no request for all messages.
+% \end{macrocode}
+% \begin{macro}{\themsg}
+% \begin{macro}{\themsgi}
+% \begin{macro}{\themsgii}
+% \begin{macro}{\themsgiii}
+% \begin{macro}{\msgid}\end{macro}
+% \begin{macrocode}
+ \def\r@trievemsg#1(#2)[#3]{\def\@argmsg{#3}%
+ \let\msg@header\empty\let\msg@trailer\empty%
+ \xdef\msgid{#1}%
+ \def\@msg@pkg{#2}% Prevent from empty file:
+ \let\themsg\msg@empty%
+ \if@msgnext\let\help\helpi\fi%
+ \let\themsgi\empty%
+ \let\themsgii\empty%
+ \let\themsgiii\empty%
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+% \begin{macrocode}
+ \let\@relaxORgobble\relax%
+ \edef\@msg@tempd{\@msg@pkg-msg.tex}%
+ \ifx\msg@languagename\undefined%
+ \ifx\languagename\undefined\else% Get current language.
+ \let\msg@input@lang\languagename%
+ \fi% If no current language, use msg's language.
+ \else\let\msg@input@lang\msg@languagename%
+ \fi%
+ \csname msg@MPC\endcsname% req. when ltxdoc
+ \ifx\msg@input@lang\undefined%
+ \let\msg@filename\@msg@tempd%
+ \else%
+ \edef\@msg@tempc{\msg@input@lang\string_\@msg@tempd}%
+ \IfFileExists\@msg@tempc{\let\msg@filename\@msg@tempc}%
+ {\let\msg@filename\@msg@tempd}%
+ \fi%
+ \edef\msg@inputlineno{the\inputlineno}%
+ \makeatletter%
+ \let\@msg@gobble@space\relax% Req. when \msgheader in first line.
+ \let\reserved@a\@gobble% Avoid runaway.
+ \bgroup\@@input@msg@filename\relax\egroup% Protected marmelade.
+ \let\msg@cmd\relax%
+ \csname msg@MPI\endcsname% req. when ltxdoc
+ \ifx\themsg\empty% Unusual end of file reached.
+ \def\@msg@tempa{\let\msg@empty\relax% to avoid loop.
+ \makeatletter%
+ \r@trievemsg6(msg)[]%
+ \makeatother%
+ }%
+ \expandafter\@msg@tempa%
+ \fi%
+ \ifx\themsg\msg@empty%
+ \PackageError{msg}%
+ {\string\msg{*} not found in \msg@filename}%
+ {please reinstall the msg package}%
+ \fi%
+ \let\if@msg@pkg@error\iffalse% Reset for next msg request.
+ \catcode`\*=\@msg@code@ast% Reset catcode too.
+ }%
+% \end{macrocode}
+%
+% The |\retrievemsg| command is the heart of all macros to obtain the
+% wanted message. It will input the message file, depending on the
+% language to use, searching for the message ``id''. If this is a valid
+% language (i.e. defined in the \texttt{language.dat}
+% file in use) and the corresponding
+% language file exists it is inputed otherwise it is the package default
+% message file which is inputed (which should be usually in English).
+% In case the message ``id'' is still not found in that file and no
+% ``|*|'' message ``id'' exists we will try to access message number 6
+% of the \msgname\ package. And again, if still not found we terminate
+% the process with a final package error; this is the only English message
+% hard coded in the \msgname\ package. Localization might occur but
+% should be also hard coded; not really usefull since it is not
+% addressed to the end user but to a package or class writer.
+%
+% \begin{center}
+% \fbox{{\texttt{\textbackslash retrievemsg\{<\emph{id}>\}(<\emph{package}>)[\#1]}}}
+% \end{center}
+% \subsection*{Examples \& tests}
+% \retrievemsg1(msg)
+% |\retrievemsg1(msg)| will set |\themsg| with the value of
+% the corresponding message ; nothing is issued at the console
+% nor in the log, except if the |<|\emph{id}|>| is not found in
+% the message file.
+%
+% \noindent|\show\themsg| will explain:
+%
+% \noindent|> \themsg=macro:|
+%
+% \noindent|->|\texttt{\themsg}
+%
+% \noindent In a French document, the same code will issue:
+%
+% \bgroup\makeatletter\def\msg@languagename{french}
+% \retrievemsg1(msg)
+% \noindent|> \themsg=macro:|
+%
+% \noindent|->|\texttt{\themsg}
+% \egroup
+%
+% In case the message file is empty or do not contain neither the message
+% ``id'' nor any |\msg{*}| macro then we will obtain:
+% \bgroup\makeatletter
+% \catcode`*=\active\let*\relax%^^A for expansion when \read case.
+% \let\@msg@code@ast=\active%^^A to simulate a missing \msg{*}.
+% \retrievemsg999(msg)
+%
+% \noindent|> \themsg=macro:|
+%
+% \noindent|->|\texttt{\themsg}
+% \egroup
+%
+% It may also arrive that we don't find that former message (|#6|) at all
+% then we will issue the usual \LaTeX\ |\PackageError| macro.
+%
+% \section{The message files}
+%
+% The default (english) message files should have the name
+% \texttt{\emph{package}-msg.tex} and localized ones should be
+% \texttt{\emph{language}\_\emph{package}-msg.tex}.
+% I would have prefered the file names begin with a dot which is
+% a hidden file in unix and thus avoid visual pollution inside packages
+% directories but, unfortunately, writing them with |doctrip| is
+% generally forbiden due to `|openout_any = p|' in |texmf.cnf|
+% configuration file.
+%
+% These files contain only the messages which could be requested
+% by the associated \texttt{\emph{package}}. It is important to say now
+% that when a message is split on multiple lines, each line must end
+% with "\verb*X %X" to avoid to loose the ending space when any is
+% required; this is due to the special |\read|ing process shown
+% page \pageref{readingprocess}.
+%
+% \subsection*{About the \TeX\ Directory Structure}
+%
+% Notice that a specfic area where to place these files could be
+% defined in the TDS.
+%
+% \bigskip\noindent
+% WARNING regarding the TDS: currently file names in the TDS should not
+% exceed 8 characters to be 8.3 file system compliant.
+% Thus file names used by the \msgname\ package have
+% a great chance to be not TDS compliant. The files would not be used
+% also on ISO-9660 CD-ROMs. But, as said Karl Berry: "I rather
+% doubt TeX Live itself would be usable on an 8.3 filesystem these days".
+% \bigskip
+%
+% \subsection*{Message files contents}
+%
+% A typical file content is the following |msg-msg.tex| file, used by
+% the \msgname\ package itself:
+%
+%</code>
+% \begin{macrocode}
+%<*english>
+% File: msg-msg.tex
+% Here are the English messages for the \msgname\ package.
+%
+% The following line is just for testing purpose:
+\msgencoding{}\msgheader{}\msgtrailer{}
+\msg{1}{\filedate\space \fileversion\space package to issue localized %
+ messages, now loaded.}{}
+\msg{2}{invalid optional parameter provided:}{}
+\msg{3}{invalid language requested: ``\CurrentOption''}{}
+\msg{4}{This is to test the #1 feature}{}
+\msg{5}{``msg'' package line number }{\msgparti{issues \#\msgid\ #1 message}}
+\msg{6}{msg package: UNUSUAL end of file reached %
+ when loading \msg@filename\space file!}{}
+\msg{7}{\string\msg\space syntax error}{\help{last % special test case
+ argument is missing.}}
+\msgheader{MESSAGE\space\msgid:\space``}\msgtrailer{''}
+\msg{8}{here is a customized message}{}%
+\msg{9}{here is a customized message %
+ \MessageBreak which continuation is aligned}{}
+\msgheader{Message\space\msgid\space(msg):\space}\msgtrailer{}
+\msg*{10}{****** I emphasize: this is a WARNING! ****** %
+ \MessageBreak ****** Be careful.^^J}{}
+\msgheader{}\msgtrailer{}
+\msg{11}{The msg package is in use with ``tracefiles'' option.}{}
+\msg{12}{A risk of infinite loop arose; %
+ \MessageBreak %
+ please check the message file: \msg@filename}%
+ {\help{Look at rules to apply in messages files.}}
+\msg{*}{erroneous message id ``\msgid''}{}
+%</english>
+% \end{macrocode}
+%
+% If necessary, one can link |english_msg-msg| to that file, but since English
+% is always the default language for \LaTeX\ this is useless.
+%
+% The same messages, localized for French, are located in
+% \label{msgfiles}
+% the following |french_msg-msg.tex| file:
+%
+% \begin{macrocode}
+%<*french>
+% Fichier french_msg-msg.tex
+% Ici on trouve les messages en francais pour l'extension \msgname\ .
+%
+% La ligne suivante est la juste pour les tests :
+\msgencoding{latin1}\msgheader{}\msgtrailer{}
+\msg{1}{\filedate\space chargement de l'extension de %
+ localisation (\fileversion).}{}
+\msg{2}{le paramètre optionnel est invalide}{}
+\msg{3}{le langage demandé (\CurrentOption) n'existe pas}{}
+\msg{4}{Ceci est pour tester le dispositif #1}{}
+\msg{5}{ligne }{\msgparti{de l'extension ``msg'' génère le %
+ message de #1 \#\msgid}}
+\msg{6}{extension msg \string: fin ANORMALE de fichier rencontrée %
+ en chargeant le fichier \msg@filename\space\string!}{}
+\msg{7}{erreur de syntaxe à l'appel de \string\msg}% cas special de test
+ {\help{il manque le dernier argument.}}
+\msgheader{MESSAGE\space\msgid\space\string:\space\string<\string<\space}
+\msgtrailer{\space\string>\string>}
+\msg{8}{ceci est un message personnalisé}{}
+\msg{9}{ceci est un message personnalisé %
+ \MessageBreak et aligné}{}
+\msgheader{Message\space\msgid\space(msg)\space\string:\space}\msgtrailer{}
+\msg*{10}{****** Je mets en valeur \string: %
+ ceci est un AVERTISSEMENT ! ****** %
+ \MessageBreak ****** Soyez prudent.^^J}{}
+\msgheader{}\msgtrailer{}
+\msg{11}{L'extension msg est en service avec l'option %
+ \string<\string< tracefiles \string>\string>.}{}
+\msg{12}{Un risque de boucle infinie a été rencontré \string; %
+ \MessageBreak %
+ vérifier le fichier des message \string: \msg@filename}%
+ {\help{Voir les règles à appliquer dans les fichiers de messages.}}
+\msg{*}{le message id ``\msgid'' n'est pas répertorié}{}
+%</french>
+% \end{macrocode}
+%
+%<*code>
+% \bigskip
+%
+% Notice that you can have messages which call any internal macro name
+% since the |\catcode| for |@| is assigned to letter when the message
+% file is read in.
+%
+% As you see, these files mostly contain |\msg| calls with three
+% arguments, so it's time now to look at this code.
+%
+% Notice that we don't use the real filenames in the above
+% |<*...>| tags since they contain an underscore character which
+% is not protected at this level when using the \textsl{ltxdoc}
+% document class.
+%
+% \section{The macros to use in message files}
+%
+% The simpliest way to code a message is:
+% \begin{center}
+% \fbox{\texttt{\textbackslash msg\{<\emph{id}>\}\{<\emph{message}>\}\{\}}}
+%
+% \end{center}
+%
+% The last message in the file should have \texttt{<\emph{id}>} equal
+% to \texttt* to say that, when reached, no valid \texttt{<\emph{id}>}
+% was found in the file and
+% the \msgname\ package should issue (or get or retrieve) that
+% error \texttt{\emph{message}}, which could be
+% e.g. |\msg{*}{erroneous message id ``\msgid''}|.
+%
+% \begin{macrocode}
+\catcode`\#=\active\def\set@argmsg{\def#1{\@argmsg}}%
+\catcode`\#=6%
+% \end{macrocode}
+% \begin{macro}{\msg}|#1#2#3|
+% \begin{macrocode}
+\def\msg{\let\@msg@gobble@space\@gobble% Should apply after firs call.
+ \@ifstar{\def\@msgskip{^^J}\@msg}{\def\@msgskip{}\@msg}}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\long\def\@msg#1{\def\@msg@tempc{#1}\catcode`\#=\active%
+ \def\@msg@tempd##1##2\void{\def\@msg@tempd{##2}%
+ \let\@msg@tempe\empty%
+ \ifx\@msg@tempd\empty%
+ \def\@msg@tempe{##1}%
+ \fi}%
+ \@msg@tempd#1\void\relax% \@msg@tempe is the first #1 token.
+ \let\themsgi\empty% We need to clean any
+ \let\themsgii\empty% previous read
+ \let\themsgiii\empty% message parts.
+ \set@argmsg\@msg@%
+ }%
+\def\@gobble@help#1#2{\@msgparts}% Case 2 lines \msg with \read but not \input.
+\long\def\@msg@#1{\def\@msg@tempd{%
+ \ifx\@msginput@usual\@@input@msg@filename%
+ \def\space{\noexpand\space}%
+ \protected@edef\msg@header{\msg@header}%
+ \protected@edef\msg@trailer{\msg@trailer}%
+ \else%
+ \edef\msg@header{\msg@header}%
+ \edef\msg@trailer{\msg@trailer}%
+ \fi%
+ \edef\space{ }%
+ \protected@xdef\themsg{%
+ \@msgskip\msg@header#1\msg@trailer}%
+ \def\space{ }%
+ }%
+ \catcode`\#=6\let\@msg@tempb\relax%
+ \def\@msg@tempb{\@ne\tw@\thr@@\sixt@@n\@cclv}%
+ \ifx\msgid\@msg@tempb% Check for any next message request.
+ \global\let\msgid\@msg@tempc%
+ \else%
+ \ifx\msgid\@msg@tempc% Check for the previous id.
+ \if@msgnext\def\msgid{\@ne\tw@\thr@@\sixt@@n\@cclv}%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\msgid\@msg@tempc% Check for the "id".
+ \let\@msgparts@ORnot\@msgparts@%
+ \def\@msg@tempb{\endinput}%
+ \if@msg@pkg@error%
+% \end{macrocode}
+% \begin{macro}{\help}|#1|
+% \begin{macrocode}
+ \let\help\@firstofone%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \def\@msgparts@ORnot{\endinput\def\@msg@txt@}%
+ \fi%
+ \def\@msg@tempf{}%
+ \expandafter\@msg@tempd%
+ \else\expandafter%
+ \ifx\@msg@tempe*\let\@msgparts@ORnot\@msgparts@%
+ \def\@msg@tempb{\endinput\@msg@tempd%
+ \PackageWarningNoLine{msg}{\themsg%
+ \themsgi\themsgii\themsgiii}%
+ \let\@relaxORgobble\@gobble}%
+ \else\let\@msgparts@ORnot\@gobble%
+ \fi%
+ \fi%
+ \catcode`\#=\active
+ \@ifnextchar\protect{\expandafter\@gobble@help}{\@msgparts}%
+ }%
+% \end{macrocode}
+%
+% When the |\msg{*}| is reached the \msgname\ package will issue a
+% |\PackageWarning| with that message, but no line number is sent
+% because the message file is still not closed and the current line
+% number is that from the message file. The message is also forwarded
+% to the TeX mouth even when an |\issuemsg| was requested.
+%
+% \subsection*{To build a \texttt{\textbackslash PackageError}
+% or \texttt{\textbackslash ClassError} message}
+% \label{buildPE}
+%
+% A |\PackageError| has a message part and a help part; these are
+% given as the following:
+%
+% \begin{minipage}[t]{0.9\textwidth}
+% \hrule\medskip
+% \begin{center}
+% \begin{tabbing}
+% |\msg{<|\emph{id}|>}{<|\emph{message-part}|>}|\=\kill^^A]
+% |\msg{<|\emph{id}|>}{<|\emph{message-part}|>}|
+% \> |{\help{<|\emph{help-part}|>}}|
+% \end{tabbing}
+% \end{center}
+% \medskip
+% \hrule\medskip
+% \end{minipage}
+%
+% \noindent in that special case you can't build a multi-parts message as
+% explained in the following section.
+%
+% \subsection*{To build a multi-parts message}
+%
+% When given, the optional argument provides 3 additional message parts.
+% Here is the syntax :
+%
+% \begin{minipage}[t]{0.9\textwidth}
+% \hrule\medskip
+% \begin{center}
+% \begin{tabbing}
+% |\msg{<|\emph{id}|>}{<|\emph{message-part1}|>}{|\=\kill^^A]
+% |\msg{<|\emph{id}|>}{<|\emph{message-part1}|>}{|
+% \> |\msgparti{<|\emph{message-part2}|>}|\\
+% \> |\msgpartii{<|\emph{message-part3}|>}|\\
+% \> |\msgpartiii{<|\emph{message-part4}|>}}|
+% \end{tabbing}
+% \end{center}
+% (Any |\msgparti*| can be omitted)
+% \medskip
+% \hrule\medskip
+% \end{minipage}
+%
+% When retrieved, |\themsg| will contain \emph{message-part1},
+% |\themsgi| the \emph{message-part2},
+% |\themsgii| the \emph{message-part3} and
+% |\themsgiii| the \emph{message-part4}.
+% One can build the wanted message with the mix of these four parts and other
+% materials. When requested via |\getmsg| or |\issuemsg| the four
+% parts are sticked in the usual order.
+%
+% These macros are defined when the last |\msg| argument is read in.
+%
+% \begin{macrocode}
+\long\def\@msgparts#1{\def\@msg@tempc{\catcode`\#=6%
+ \def\@msg@tempb{\issuemsg[%
+ \PackageError{\@msg@pkg}]{7}(msg)%
+ \endinput}%
+ \expandafter\@msg@tempb%
+ }%
+ \ifx\msg#1% When #1 is \msg it's sure the previous \msg
+ \@msg@tempc% didn't provided the correct arguments.
+ \else%
+ \ifx\msgheader#1\@msg@tempc% ditto for \msgheader
+ \else%
+ \ifx\msgtrailer#1\@msg@tempc% ditto for \msgtrailer
+ \else%
+ \ifx\msgencoding#1\@msg@tempc% ditto for \msgencoding
+ \else%
+ \@msgparts@ORnot{#1}%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \@ifnextchar\space{\@gobble}{}% Gobble any superfluous blank.
+ }%
+% \end{macrocode}
+% \begin{macro}{\msgparti}|#1|
+% \begin{macro}{\msgpartii}|#1|
+% \begin{macro}{\msgpartiii}|#1|
+% \begin{macrocode}
+%
+\long\def\@msgparts@#1{\long\def\msgparti##1{\xdef\themsgi{##1}}%
+ \long\def\help##1{\xdef\themsgi{\space help=##1}}%
+ \long\def\helpi##1{\xdef\themsgi{\space help=##1}}%
+ \long\def\msgpartii##1{\xdef\themsgii{##1}}%
+ \long\def\msgpartiii##1{\xdef\themsgiii{##1}}%
+ #1\catcode`\#=6\expandafter\@msg@tempb%
+ }%
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% \section*{Input encoding discussion}\label{encodings}
+%
+% It is assumed that, defaultly, |\issuemsg| will finally provide a message
+% to the console (without any encoding).
+% The macro |\getmsg| is designed for typesetting (usually with an
+% input encoding). Since
+% |\retrievemsg|'s target is unknown, display or typesetting, we let
+% the package or class maker to decide which input encoding has to be
+% set up.
+%
+% If you want to issue a message but not to the console, you should
+% probably use the macro |\issuemsgx| in place of |\issuemsg|.
+%
+% \subsection*{For messages issued to the console}
+%
+% If your messages can be coded in 7bits, no problem except that you
+% probably need to avoid macros like |\aa|, |\oe|, |\ae|, etc. which
+% can't output as expected on the console or log file.
+% If your messages use 8bits characters, these 8bits characters will
+% be output asis.
+%
+% \subsection*{For messages to be typeset}
+%
+% If any of your messages use at least one 8bits character, you need to
+% specify which input encoding you are using:
+% \begin{center}
+% \fbox{\texttt{\textbackslash msgencoding\{<\emph{input encoding}>\}}}
+%
+% \end{center}
+% you just have to give the name of the input encoding, exactly like
+% with |\inputencoding| for the \texttt{inputenc} package.
+% This is usually the first command in the messages file.
+%
+% \begin{macro}{\msgencoding}|#1|
+% \begin{macrocode}
+\let\@msgencoding\@gobble% Nearly null macro until \AtBeginDocument,
+\def\msgencoding#1{\ifx\empty#1\else% just disactive 8bits chars.
+ \let\iterateORI\iterate%
+ \def\@msg@encoding{#1}%
+ \ifx\msg@cmd\issuemsg%\inputencoding{ascii}%
+ \def\@msgenc@loop##1##2{\@tempcnta`##1\relax%
+ \loop\catcode\@tempcnta=11%
+ \ifnum\@tempcnta<`##2\relax%
+ \advance\@tempcnta\@ne%
+ \repeat}%
+ \@msgenc@loop\^^A\^^H%
+ \@msgenc@loop\^^K\^^K%
+ \@msgenc@loop\^^N\^^_%
+ \@msgenc@loop\^^?\^^ff% 128-255
+ \else\let\@latex@infoORI\@latex@info%
+ \let\@latex@info\@gobble%
+ \let\endinputBACK\endinput%
+ \let\endinput\endinputORI%
+ \@msgencoding{#1}%
+ \let\endinput\endinputBACK%
+ \let\@latex@info\@latex@infoORI%
+ \fi\makeatletter%
+ \let\iterate\iterateORI%
+ \fi%
+ }%
+\let\@msg@encoding\empty% Unknown current encoding.
+\AtBeginDocument{\let\@msgencoding\inputencoding}%
+% \end{macrocode}
+% \subsection*{Disadvantage using \texttt{\textbackslash msgencoding}}
+%
+% As the \texttt{inputenc} package is automatically loaded when
+% |\msgencoding| is executed, there is a risk you try loading again
+% \texttt{inputenc} in the preamble via |\usepackage|. This is the case
+% if any message was already issued by the \msgname\ package and then
+% an option clash will occur and force you to put the encoding option
+% as a global option in |\documentclass|.
+% \end{macro}
+%
+% \section*{The messages file rules}
+%
+% Due to the previous |\read| (page \pageref{readcode}) code
+% you should apply the following rules in
+% a message file:
+% \begin{description}
+% \item [Rule 1:] A line can be a comment (begining with \%).
+% \item [Rule 2:] A line can begin with |\msg|,|\msgheader|,|\msgtrailer|
+% or |\msgencoding|.
+% \item [Rule 3:] A |\msg| line can be continued on the next line(s), assuming
+% each one ends with \verb*X %X.
+% \item [Rule 4:] The following macros: |\msgheader|, |\msgtrailer|,
+% or |\msgencoding| are alwauys executed.
+% \item [Rule 5:] Spacing inside |\msgheader| and |\msgtrailer| should be
+% made only by the use of the macro |\space|.
+% \item [Rule 6:] Any of these three macros should be expandable at any time.
+% \item [Rule 7:] No other macro command can begin a line.
+% \item [Rule 8:] All 8bits characters used should in the range specified
+% by the |\msgencoding| macro command.
+% \end{description}
+% That's all!
+%
+% \subsection*{To build messages with header and/or trailer}
+%
+% \begin{macro}{\msgheader}|#1|\label{msgtrailerdef}
+% \begin{macro}{\msgtrailer}|#1|\end{macro}\end{macro}
+% \begin{macrocode}
+\def\msgheader#1{\let\reserved@a\relax%
+ \def\msg@header{#1}\protect\@msgHTsptoken}%
+\def\msgtrailer#1{\let\reserved@a\relax%
+ \def\msg@trailer{#1}\protect\@msgHTsptoken}%
+\def\@msgHTsptoken{\@ifnextchar\@sptoken{\@msg@gobble@space%
+ \let\@msg@gobble@space\@gobble}%
+ {\let\@msg@gobble@space\@gobble}%
+ }%
+% \end{macrocode}
+%
+% Before any |\msg| call you can specify which header and/or trailer you
+% want in the following message or messages. You just have to specify them:
+%
+% \begin{minipage}[t]{0.4\textwidth}
+% \hrule\medskip
+% \begin{center}
+% |\msgheader{<|\emph{my\_header}|>}|\\
+% |\msgtrailer{<|\emph{my\_trailer}|>}|
+% \end{center}
+% \hrule\medskip
+% \end{minipage}
+%
+% When a message needs to be continued on the next line you just
+% have to insert |\MessageBreak| where you want the new line will
+% start and then the \msgname\ package will try to align the following
+% text by adding the same number of |\space|s as tokens in the
+% expandded |\msgheader|. That feature only applies with |\issuemsg|.
+%
+% \subsection*{To emphasize a message}
+%
+% When you want to emphasize a message you just have to code the star form of
+% the |\msg| macro:
+%
+% \begin{minipage}[t]{0.9\textwidth}
+% \hrule\medskip
+% \begin{center}
+% \begin{tabbing}
+% |\msg*{<|\emph{id}|>}{<|\emph{message-part1}|>}|\=\kill^^A]
+% |\msg*{<|\emph{id}|>}{<|\emph{message-part1}|>}|
+% \> |{<|\emph{part2}|}>}|
+% \end{tabbing}
+% \end{center}
+% \hrule\medskip
+% \end{minipage}
+%
+% and then the message will be issued after a line skip on the console and log.
+% If your message ends with |^^J| another line will be skiped after.
+% Obviously this feature only works with |\issuemsg| but not with
+% |\getmsg| or |\retrievemsg|.
+%
+% \subsection*{Examples \& tests}
+%
+% We use message \# 5 of |msg-msg.tex| file as following:
+%
+% \noindent
+% \def\foo#1{\retrievemsg5(msg)[#1]\themsg\the\inputlineno\ \themsgi}
+% |\def\foo#1{\retrievemsg5(msg)[#1]\themsg\the\inputlineno\ \themsgi}|
+%
+% \medskip\noindent
+% then |\emph{The \foo{test}}| will generate:
+%
+% \centerline{The \emph{\foo{test}}}
+%
+% \noindent
+% In a French document, the code |\emph{La \foo{test}}| will issue:
+%
+% \bgroup\makeatletter\def\msg@languagename{french}
+% \centerline{\emph{La \foo{test}}}
+% \egroup
+%
+% \medskip
+% We will now use the message \# 8 of |msg-msg.tex| file in order
+% to show the customization set in that file.
+%
+% \medskip\noindent
+% |\getmsg8(msg)| will generate:\\
+% \getmsg8(msg)
+%
+% The following |\texttt{\getmsg9(msg)}| using
+% |\MessageBreak| will give at the console:\\%
+% {\catcode`^^J=\active\let^^J\\%^^A We try to simulate the output console.
+% \def\@msgalspace{\hbox{\space}}%^^A In order to simule \obeyspaces
+% \def\space{\@sptoken}%^^A we used \space in \msgheader argument.
+% \def\MessageBreak{^^J\expandafter\@msgalign\msg@header\void%
+% \hbox{\space}}%^^A Please explain this tt behaviour...
+% \texttt{\getmsg9(msg)}\\%
+% }
+% (same message issued to the console\issuemsg9(msg)).%^^A Issue it really.
+%
+% \noindent
+% And in a French document, the same calls will issue:\\
+% \bgroup\makeatletter\def\msg@languagename{french}%
+% \getmsg8(msg)\\%
+% \catcode`<=12\catcode`>=12\relax%^^A To remove ltxdoc active chars.
+% \catcode`^^J=\active\let^^J\\%^^A We try to simulate the output console.
+% \def\@msgalspace{\hbox{\space}}%^^A In order to simule \obeyspaces
+% \def\space{\@sptoken}%^^A We try to simulate the output console.
+% \def\MessageBreak{^^J\expandafter\@msgalign\msg@header\void%
+% \hbox{\space}}%^^A Please explain this tt behaviour...
+% \texttt{\getmsg9(msg)}
+%
+% \egroup
+%
+% Below is a test of an emphasized message (|\texttt{\getmsg{10}(msg)}|):
+%
+% {\catcode`^^J=\active\let^^J\\%^^A We try to simulate the output console.
+% \def\msg{\@ifstar{\def\@msgskip{\\}\@msg}{\def\@msgskip{}\@msg}}%
+% \def\@msgalspace{\hbox{\space}}%^^A In order to simule \obeyspaces
+% \def\space{\@sptoken}%^^A we used \space in \msgheader argument.
+% \def\MessageBreak{^^J\expandafter\@msgalign\msg@header\void%
+% \hbox{\space}}%^^A Please explain this tt behaviour...
+% \noindent\texttt{\getmsg{10}(msg)}%
+% }
+% (same message issued to the console\issuemsg{10}(msg)).
+%
+% \section{Testing a message file}
+%
+%
+% When you are building a message file few typing errors can occur; so
+% there is a need to test that file. You can do this by using the
+% following macro call:
+%
+% \begin{center}
+% \fbox{{\texttt{\textbackslash issueallmsg[<\emph{message\_macro}>](<\emph{package}>)}}}
+% \end{center}
+%
+% All messages will be retrieved and issued as requested (with the message
+% macro) but not, perhaps, with the exact macro call which will be used in the
+% \LaTeXe\ package or document class. Specially, the |\help| macro call
+% does nothing and |\msgpart|s are listed in the order found in the file.
+% You should also notice that all macro used inside the
+% messages should be expandable. This macro is allways executed with
+% the \texttt{tracefiles}%
+% \footnote{I never found the right code to avoid a loop with
+% \texttt{tracefiles} option...} option.
+%
+% Here is an example using the \msgname\ file
+% (|\issueallmsg[\wlog](msg)|)%
+% \wlog{^^J **************** Testing the file *************}%
+% \issueallmsg[\wlog](msg)
+% \wlog{^^J **************** The End of test *************}%
+% please check the log file to find the output.
+%
+% \begin{macro}{\issueallmsg}|[#1](#2)|\label{issueallmsg}
+% \begin{macrocode}
+ \def\issueallmsg{\bgroup\let\@@input@msg@filename\@msginput@usual%
+ \let\msg@cmd\issuemsg%
+ \@ifnextchar[{\i@sueallmsg}{\i@sueallmsg[\issuemsgio]}%]
+ }%
+ \def\i@sueallmsg[#1]{\let\@msg@iocmdn#1\i@@ueallmsg}%
+ \def\i@@ueallmsg(#1){\def\next{\i@@@eallmsg(#1)}%
+ \long\def\help##1{\xdef\themsgi{\space help=##1}}%
+ \let\if@msgnext\iftrue% begin/continue loop.
+ \def\msgid{\@ne\tw@\thr@@\sixt@@n\@cclv}% Set next one wanted.
+ \let\prev@msgid\msgid% Save previous id.
+ \i@@@eallmsg(#1)% Go for looping.
+ \let\if@msgnext\iffalse%
+ }%
+ \def\i@@@eallmsg(#1){\def\@tempa{\i@@uemsg[\@msg@iocmdn]}%
+ \let\themsg\empty%
+ \expandafter\@tempa\expandafter{\msgid}(#1)[]% Get it.
+ \def\@tempa{\let\if@msgnext\iffalse}%
+ \ifx\prev@msgid\msgid%
+ \@tempa%
+ \let\@@input@msg@filename\@msginput@usual%
+ \issuemsg[\PackageError{msg}]{12}(msg)%
+ \expandafter\stop%
+ \fi%
+ \let\prev@msgid\msgid% Save previous id.
+ \def\@tempa{*}% Check if last one.
+ \ifx\msgid\@tempa%
+ \let\next\egroup% This is the end.
+ \fi%
+ \let\msg@cmd\issuemsg%
+ \next%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \section{Output options}
+%
+% \begin{center}
+% \fbox{\texttt{\textbackslash usepackage[<\emph{output-options}>]\{msg\}}}%
+% \end{center}
+%
+% The output options provide to the \msgname\ package with a running
+% macro name to issue any message, in replacement of the default
+% |\issuemsgio| macro initialized at the begining (cf page~\pageref{msgio}).
+% Currently the following macro names are defined as options:
+%
+% \begin{center}
+% \def|{$\mid$}
+% \fbox{\texttt{\textbackslash usepackage[message|wlog|typeout|kbtypeout]\{msg\}}}%
+% \end{center}
+%
+% \begin{macrocode}
+\DeclareOption{message}{\let\issuemsgio\message}% TeX cs.
+\DeclareOption{wlog}{\let\issuemsgio\wlog}% Plain TeX cs.
+\DeclareOption{typeout}{\let\issuemsgio\typeout}% LaTeX cs.
+\DeclareOption{kbtypeout}{\let\issuemsgio\kbtypeout}% Keyboard cs.
+% \end{macrocode}
+%
+% These options are related to basic messages macros but this
+% is not an exhaustive list of macros which can be called by
+% |\issuemsg|. Specially, |\PackageError| can also be used,
+% as already discussed p.~\pageref{willingPE} and p.~\pageref{buildPE}.
+% The last one macro name is coming from a package of mine
+% (\textsf{keyboard}) doing input encoding and output decoding.
+%
+% \section{A tracing option}
+%
+% \begin{center}
+% \fbox{\texttt{\textbackslash usepackage[<\emph{tracefiles}>]\{msg\}}}%
+% \end{center}
+%
+% The \texttt{tracefiles} option changes the processing for reading
+% message files. Defaultly these files are not read with the usual
+% |\input| macro and so the files are not listed in the \texttt{log}
+% file. When giving the \texttt{tracefiles} option message files
+% are read with a |\input| macro like and then the full path names
+% are listed.
+%
+% \begin{macrocode}
+\DeclareOption{tracefiles}{\let\@@input@msg@filename\@msginput@usual%
+ }%
+% \end{macrocode}
+%
+% \section{Language options}
+%
+% \begin{center}
+% \fbox{\texttt{\textbackslash usepackage[<\emph{output-options}>,<\emph{language-name}>]\{msg\}}}%
+% \end{center}
+%
+% Defaultly messages are issued from the message file dedicated to the
+% document running language. One can force the \msgname\ package to use
+% a specific language (assuming it was defined in the \texttt{language.dat}
+% file in use), just give it as the last option.
+%
+% \begin{macro}{\nativelanguage}|#1|\end{macro}
+% \begin{macrocode}
+\edef\nativelanguage{french}% This is my native language.
+% \end{macrocode}
+% This optional macro is usefull to understand and/or translate
+% correctly the message files. Each package writer can define it
+% as i currently do for the \msgname\ package here. To obtain messages
+% in writer's native language, just call the \msgname\ package with
+% the option `|native|':
+%
+% \begin{center}
+% \fbox{\texttt{\textbackslash usepackage[<\emph{output-options}>,native]\{msg\}}}%
+% \end{center}
+%
+% The previous line of code declares |french| as an option for the \msgname\
+% package itself. Going this way we redefine |\packagewarning| we set at
+% the begining page~\pageref{pw} and translate |\on@line| in French.
+% I don't suggest to do the same for all other languages... this is just
+% a native language privilege.
+%
+% \begin{macrocode}
+\let\on@lineORI\on@line%
+\let\pwhORI\packagewarningheader%
+\DeclareOption{french}{% Mostly a testing option
+ % or have msg's messages in French.
+ \@msgINfrench}%
+\def\@msgINfrench{%
+ \def\on@line{ (voir le source, ligne \the\inputlineno)}%
+ \def\packagewarningheader##1{Extension ##1 : ATTENTION, }%
+ \def\msg@languagename{french}}%
+% \end{macrocode}
+%
+% It may occur that the |\languagename| is already set (e.g. in the
+% \LaTeX\ format), so we test it; if French is set the \msgname\ package will
+% then speak that language.
+%
+% \begin{macrocode}
+\edef\@msg@tempa{french}\ifx\languagename\@msg@tempa\@msgINfrench\fi%
+% \end{macrocode}
+% Here is the code to process the last option:
+% \begin{macrocode}
+% Last option will be the msg's language if defined (within the
+% \texttt{language.dat} file in use).
+\DeclareOption*{% Once a language is provided we should
+ \let\on@line\on@lineORI% reset to default.
+ \let\packagewarningheader\pwhORI%
+ \def\@msg@tempa{native}%
+ \ifx\@msg@tempa\CurrentOption%
+ \let\msg@languagename\nativelanguage%
+ \else%
+ \expandafter%
+ \ifx\csname l@\CurrentOption\endcsname\relax%
+ \def\@msg@tempa{\retrievemsg3(msg)\PackageWarningNoLine{msg}%
+ {\themsg\themsgi\themsgii\themsgiii}}%
+ \else\def\@msg@tempa{\edef\msg@languagename{\CurrentOption}}%
+ \fi\@msg@tempa%
+ \fi%
+ }%
+%
+% \end{macrocode}
+% The last option, if undeclared, is assumed to be a language name. If that
+% language is unknown (i.e. undefined in the \texttt{language.dat} file
+% in use) we issue a warning with message number 3,
+% otherwise that language name will be now the prefix for all
+% the message files names searchs. It overides any previously set
+% (in format, package, ...) language name for use by the \msgname\ package.
+%
+% Notice that, when set (and forced) as option, the \msgname\ language
+% name can't be changed any way inside the document (no language
+% change can modify that).
+%
+% \section{Finally}
+%
+% It's time now to process the options, get the \msgname\ package's banner
+% and issue it as well in the log file.
+%
+% That's all for the code.
+%
+% \begin{macrocode}
+\ProcessOptions% Process options
+% Retrieve msg: \filedate\ msg package (\fileversion) loaded.
+\bgroup% Protect from any setting.
+\retrievemsg1(msg)%
+\csname msg@MPC\endcsname% required when ltxdoc
+\ProvidesPackage{msg}[\themsg]% Issue that message in log file with
+\def\@msg@tempa{\retrievemsg{11}(msg)\wlog{\themsg}}% options messages.
+\ifx\@@input@msg@filename\@msginput@usual\expandafter\@msg@tempa\fi%
+\egroup%
+%</code>
+% \end{macrocode}
+% \section{Migration scheme}
+%
+% If you want to migrate a document class ou package issuing messages
+% in order it could be localized for any language, you just have
+% to follow the following steps:
+%
+% \begin{enumerate}
+% \item Chose the native language and create the related messages file.
+% \item Chose the input encoding and define it in the messages file
+% with |\msgencoding|.
+% \item Insert the final error message (|\msg(*){...}{}|).
+% \item Isolate all messages in the code.
+% \item Attach to each message a unique \textsl{id}.
+% \item Comment each message argument(s) and put these arguments
+% in the message file as: \\
+% |\msg{|\textsl{id}|}{|\textsl{argument1}|}{<|\textsl{argument2}|>}|
+% \item Replace the message macro call (|\typeout| or |\wlog| or ...)
+% by : \\
+% |\issuemsg[<|\textsl{message macro}|>]{|\textsl{id}|}(|\textsl{package}|)|
+% \item Check the syntax carefully, specially, for error messages and
+% when a parameter will be used.
+% \item Test each message independtly and tune it considering the
+% display option, the header and trailer facilities, etc.
+% \item Test the messages file with |\issueallmsg|.
+% \item Consider other translations of your native messages file.
+% \item Release the new code along with its messages files.
+% \end{enumerate}
+%
+% \section{Generated files}
+%
+% Currently the file |msg.ins| is the file to compile with (La)TeX
+% to generate all the \msgname\ stuff. Here is |msg.ins| showing
+% the |doctrip| generated files:
+%
+% \makeatletter%
+% \def\verbatimfile#1{\begingroup\small\let\check@percent\relax\tt%
+% \@verbatim\frenchspacing\@vobeyspaces%
+% \@@input#1\endgroup}%
+% \makeatother%
+% \bigskip\hrule
+% \verbatimfile{msg.ins}%
+%
+% \bigskip
+% \hrule
+%
+% \section{Volunteers}
+%
+% Volunteers are welcome to translate the \msgname\ package message
+% file (the English one or the native one in French) in their mother language.
+% Lot of thanks to them!
+%
+% \section{Thanks}
+%
+% The following people contributed to that project and we really appreciate
+% their effort for testing, translating, documenting, etc.:
+% Hans~F.~Nordhaug, Harald~Harders.
+% \vfill
+% Enjoy!
+% \vfill
+% \centerline{$*$--$*$}
+% \vfill
+% \newpage
+% \iffalse
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~
+%% And any code from 128 to 255
+%% }
+%%
+% \fi
+% \Finale%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/Master/texmf-dist/source/latex/msg/msg.ins b/Master/texmf-dist/source/latex/msg/msg.ins
new file mode 100644
index 00000000000..d9ebf33f618
--- /dev/null
+++ b/Master/texmf-dist/source/latex/msg/msg.ins
@@ -0,0 +1,23 @@
+\def\batchfile{msg.ins}
+\input docstrip.tex
+\askonceonly
+\keepsilent
+\preamble
+
+ File is part of the "msg" package for LaTeX
+ which is designed to localize any LaTeX package
+ or document class.
+
+\endpreamble
+\generateFile{README_msg_doc.txt} {t}{\from{msg.dtx}{README}}
+\generateFile{msg.sty} {t}{\from{msg.dtx}{code}}
+\generateFile{msg-msg.tex} {t}{\from{msg.dtx}{english}}
+\generateFile{french_msg-msg.tex} {t}{\from{msg.dtx}{french}}
+\generateFile{norsk_msg-msg.tex} {t}{\from{msgfiles.dtx}{norsk}}
+\generateFile{german_msg-msg.tex} {t}{\from{msgfiles.dtx}{german}}
+\Msg{*****************************************************}
+\Msg{* "msg" package now generated, please move msg.sty *}
+\Msg{* file and *-msg.tex messages files in the *}
+\Msg{* appropriate directory where LaTeX can find them. *}
+\Msg{*****************************************************}
+\endinput
diff --git a/Master/texmf-dist/source/latex/msg/msgfiles.dtx b/Master/texmf-dist/source/latex/msg/msgfiles.dtx
new file mode 100644
index 00000000000..19db7d3a73a
--- /dev/null
+++ b/Master/texmf-dist/source/latex/msg/msgfiles.dtx
@@ -0,0 +1,97 @@
+% \iffalse meta-comments
+% msg_doc.txt.dtx original file name. An idea of Bernard Gaulle 2004/04/02
+%
+% last mods on 2005/01/10
+%
+% Copyright (C) 2004 LPPL - Bernard Gaulle.
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License as of http://www.latex-project.org/lppl.txt
+%
+% This file has the LPPL maintenance status "maintained".
+% The current maintainer is Bernard.Gaulle at idris.fr
+% \fi
+%
+%<*norsk>
+\msgencoding{latin1}\msgheader{}\msgtrailer{}
+\msg{1}{\filedate\space \fileversion\space pakke for lokaliserte %
+ meldinger er nå lastet.}{}
+\msg{2}{Ugyldig valgfri parameter oppgitt:}{}
+\msg{3}{Ugyldig språk valgt: ``\CurrentOption''}{}
+\msg{4}{Testing av en #1 funksjon}{}
+\msg{5}{msg-pakken viser på linjenummer } %
+ {\msgparti{melding \#\msgid : #1 }}
+\msg{6}{msg-pakke: Uvanlig slutt på filen nådd %
+ \MessageBreak under lasting av filen \msg@filename !}{}
+\msg{7}{Syntaksfeil i \string\msg\space }{\help{siste % special test case
+ argument mangler.}}
+\msgheader{MELDING\space\msgid:\space``}\msgtrailer{''}
+\msg{8}{Her er en tilpasset melding}{}%
+\msg{9}{Her er en tilpasset melding %
+ \MessageBreak hvor fortsettelsen er venstre-justert}{}
+\msgheader{Message\space\msgid\space(msg):\space}\msgtrailer{}
+\msg*{10}{****** Jeg uthever: Dette er en ADVARSEL! ****** %
+ \MessageBreak ****** Vær forsiktig.^^J}{}
+\msgheader{}\msgtrailer{}
+\msg{11}{msg-pakken er i bruk med tracefiles-opsjonen.}{}
+\msg{12}{En risiko for uendelig løkke oppstod; %
+ \MessageBreak %
+ sjekk meldingsfila: \msg@filename}%
+ {\help{Undersøk reglene for meldingsfiler.}}
+\msg{*}{Feilaktig meldingsid ``\msgid''}{}
+%
+% \iffalse
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% This messages file is coded in full 8bit. %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \fi
+%</norsk>
+%<*german>
+\msgencoding{latin1}\msgheader{}\msgtrailer{}
+\msg{1}{\filedate\space \fileversion\space Paket zur Verwendung %
+ lokalisierter Nachrichten geladen.}{}
+\msg{2}{Ungültiger optionaler Parameter definiert:}{}
+\msg{3}{Ungültige Sprache angefordert: ,,\CurrentOption``}{}
+\msg{4}{Dies testet das #1-Feature}{}
+\msg{5}{,,msg``-Paket, Zeilennummer }{\msgparti{Ausgabe der %
+ Nachricht \#\msgid\ #1}}
+\msg{6}{msg-Paket: Ungewöhnliches Dateiende erreicht %
+ beim Lesen der Datei \msg@filename!}{}
+\msg{7}{\string\msg\space Eingabefehler}{\help{Letztes % special test case
+ Argument fehlt.}}
+\msgheader{Nachricht\space\msgid:\space,,}\msgtrailer{``}
+\msg{8}{Dies ist eine Benutzernachricht}{}%
+\msg{9}{Dies ist eine Benutzernachricht %
+ \MessageBreak mit ausgerichteter Fortsetzung}{}
+\msgheader{Nachricht\space\msgid\space(msg):\space}\msgtrailer{}
+\msg*{10}{****** Ich betone: Dies ist eine Warnung! ****** %
+ \MessageBreak ****** Obacht!^^J}{}
+\msgheader{}\msgtrailer{}
+\msg{11}{Das msg-Paket wird mit der ,,tracefiles``-Option %
+ verwendet.}{}
+\msg{12}{Ein Risiko einer Endlosschleife ist aufgetreten; %
+ \MessageBreak %
+ Siehe Message-Datei: \msg@filename}%
+ {\help{Siehe Hinweise in den Message-Dateien.}}
+\msg{*}{Fehlerhafte Nachrichten-ID ,,\msgid``}{}
+% \iffalse
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%%
+% \fi
+</german>
+% \Finale%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%