From 3e4facabd7e33e78ece63d391d6fc6c94842873d Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 13 Mar 2015 23:23:22 +0000 Subject: luatodonotes (13mar15) git-svn-id: svn://tug.org/texlive/trunk@36505 c570f23f-e606-0410-a88d-b1316a301751 --- .../source/lualatex/luatodonotes/luatodonotes.dtx | 263 +++++++++++++-------- .../source/lualatex/luatodonotes/luatodonotes.ins | 16 +- 2 files changed, 181 insertions(+), 98 deletions(-) (limited to 'Master/texmf-dist/source/lualatex') diff --git a/Master/texmf-dist/source/lualatex/luatodonotes/luatodonotes.dtx b/Master/texmf-dist/source/lualatex/luatodonotes/luatodonotes.dtx index 3188307f4c5..79537444e2e 100644 --- a/Master/texmf-dist/source/lualatex/luatodonotes/luatodonotes.dtx +++ b/Master/texmf-dist/source/lualatex/luatodonotes/luatodonotes.dtx @@ -1,9 +1,9 @@ % \iffalse meta-comment % -% Copyright (C) 2014 by Fabian Lipp +% Copyright (C) 2014-2015 by Fabian Lipp % based on the todonotes package % by Henrik Skov Midtiby -% ------------------------------------------------------- +% ------------------------------------------------------------ % % This file may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.2 @@ -24,20 +24,20 @@ %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{luatodonotes} %<*package> - [2014/08/07 v0.1 luatodonotes source and documentation.] + [2015/03/13 v0.2 luatodonotes source and documentation.] % % %<*driver> \documentclass{ltxdoc} \usepackage{wrapfig} \usepackage[colorlinks, linkcolor=black, urlcolor=blue]{hyperref} -\usepackage[colorinlistoftodos, shadow]{luatodonotes}[2014/06/08] +\usepackage[colorinlistoftodos, shadow]{luatodonotes}[2015/03/13] \usepackage{fontspec} \usepackage{amsmath} \usepackage{setspace} \usepackage{soul} \setcounter{tocdepth}{2} -\EnableCrossrefs +\EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} @@ -50,7 +50,7 @@ % % \fi % -% \CheckSum{841} +% \CheckSum{825} % % \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 @@ -70,7 +70,19 @@ % % % \changes{0.1}{2014/08/07}{The first version of the package} -% \GetFileInfo{luatodonotes.dtx} +% \changes{0.2}{2014/09/08}{Compatibility with csquotes package (notes were +% displayed multiple times when used in \texttt{\textbackslash blockquote} +% command)} +% \changes{0.2}{2015/01/13}{Fix wrong linespacing when changing fontsize} +% \changes{0.2}{2015/01/13}{Included suggestions from CTAN submission into +% documentation} +% \changes{0.2}{2015/02/28}{Make Lua variables and functions local or put them +% into luatodonotes array (don't pollute global namespace)} +% \changes{0.2}{2015/02/28}{Correct height calculation for notes with modified +% fontsize} +% \changes{0.2}{2015/03/03}{Fix problems with recent versions of lualibs} +% \changes{0.2}{2015/03/12}{Added troubleshooting section to documentation} +% \GetFileInfo{luatodonotes.dtx} % % \DoNotIndex{\newcommand,\newenvironment} % @@ -95,10 +107,11 @@ % to--do items can be listed with the |\listoftodos| command. % % It is an extended version of the |todonotes| package and uses more advanced -% algorithms to place the to--do notes notes on the page. +% algorithms to place the to--do notes on the page. % For this algorithms it depends on Lua\TeX. % \end{abstract} % +% \pdfbookmark[1]{Contents}{contents} % \tableofcontents % % \newpage @@ -123,13 +136,13 @@ % % Some alternatives for the luatodonotes package are: % \begin{itemize} -% \item \href{http://www.ctan.org/tex-archive/macros/latex/contrib/easy-todo}{easy-todo}\\ +% \item \href{http://www.ctan.org/pkg/easy-todo}{easy-todo}\\ % Depends on |color|, |tocloft| and |ifthen|, small feature set. % \item \href{http://www.ctan.org/pkg/fixmetodonotes}{fixmetodonotes}\\ % Depends on |graphicx|, |color|, |transparent|, |watermark|, |fix-cm|, |ulem| and |tocloft|, small feature set. -% \item \href{http://www.ctan.org/tex-archive/macros/latex/contrib/todo}{todo}\\ +% \item \href{http://www.ctan.org/pkg/todo}{todo}\\ % Depends on |amssymb|, medium feature set. -% \item \href{http://www.ctan.org/tex-archive/macros/latex/contrib/fixme}{fixme}\\ +% \item \href{http://www.ctan.org/pkg/fixme}{fixme}\\ % Large package with a lot of features. % \item \href{http://www.ctan.org/pkg/todonotes}{todonotes} % \end{itemize} @@ -139,7 +152,7 @@ % page. % Additionally, we are able to place notes at almost every position on the % page, e.\,g., in floating environments or in footnotes. -% As a disadvantage luatodonotes requires Lua\LaTeX for document processing, so +% As a disadvantage luatodonotes requires Lua\LaTeX{} for document processing, so % a standard |pdflatex| won't work. % Depending on the chosen layout for the to--do notes the runtime can be much % higher than with todonotes. @@ -147,13 +160,28 @@ % |\marginpar|. % % The main reason for considering other packages is that the todonotes -% package is quire large and relies heavily on tikz. +% package is quite large and relies heavily on tikz. % This can slow down compilation of large documents significantly. -% The mentioned alternatives have a different feature set and does not +% The mentioned alternatives have a different feature set and do not % rely on tikz, which makes them require less ressoureces. % % -% \subsection{Usage} +% +% \subsection{Using Lua\LaTeX} +% It is quite easy to switch from |pdflatex| to |lualatex|. +% You only have to load a few different packages. +% A small guide can be found in the Lua\LaTeX{} +% guide\footnote{\url{http://mirror.ctan.org/info/luatex/lualatex-doc/lualatex-doc.pdf}}. +% +% The Lua\TeX{} processor (the |lualatex| executable) should be included in all +% modern \TeX{} distributions, so you do not need to install additional +% software. +% You simply have to run |lualatex| instead of |pdflatex| (or instead of +% |latex|, |xelatex|). +% +% +% +% \subsection{Usage of luatodonotes} % The package is loaded with |\usepackage|\oarg{options}|{luatodonotes}|. % Valid options are described in Section~\ref{subsecPackageOptions}. % Note that |todonotes| must \emph{not} be loaded. @@ -434,7 +462,7 @@ % for label placement. % If both margins are narrower, no labels are placed and an error message is % printed to the console output. -% The default value of this option is |2.0cm|. +% The default value of this option is |1.0cm|. % % \DescribeMacro{distanceNotesPageBorder} % The |distanceNotesPageBorder=length| option specifies the horizontal distance @@ -466,7 +494,7 @@ % % % -% \subsection{Options for the todo command} +% \subsection{Options for the \texttt{todo} command} % \label{subsecTodoOptions} % There are several options that can be given to the |\todo| % command. All the options are described here and often I have @@ -608,7 +636,7 @@ % \todo[author=Xavier, inline]{Testing author option.} % \end{verbatim} % -% \subsection{Options for the missingfigure command} +% \subsection{Options for the \texttt{missingfigure} command} % % \DescribeMacro{figwidth} % The |figwidth=length| option sets the width of the figure inserted by the @@ -647,7 +675,7 @@ % \missingfigure[figheight=6cm]{Testing} % % -% \subsection{Options for the listoftodos command} +% \subsection{Options for the \texttt{listoftodos} command} % The |\listoftodos| command takes one optional argument, that % defines the name of the inserted list of todos. % \begin{verbatim} @@ -655,6 +683,54 @@ % \end{verbatim} % % +% \subsection{Troubleshooting} +% \subsubsection{Missing Lua files} +% A potential error message when Lua source files are not found, is the +% following: +% \begin{verbatim} +% ! LuaTeX error [\directlua]:1: module 'luatodonotes' not found: +% no field package.preload['luatodonotes'] +% [luatexbase.loader] Search failed +% [kpse lua searcher] file not found: 'luatodonotes' +% [kpse C searcher] file not found: 'luatodonotes' +% [oberdiek.luatex.kpse_module_loader]-eroux Search failed +% stack traceback: +% [C]: in function 'require' +% [\directlua]:1: in main chunk. +% l.250 \directlua{require("luatodonotes")} +% \end{verbatim} +% This means that the file |luatodonotes.lua| cannot be found by Lua\TeX. +% It depends on the version of your \TeX{} installation. in which directories +% Lua\TeX{} is looking for Lua source files. +% You can query these paths with the following command: +% \begin{verbatim} +% kpsewhich -show-path=lua\end{verbatim} +% See the |kpathsea| +% documentation\footnote{\url{http://tug.org/texinfohtml/kpathsea.html}} for +% the interpretation of this path. +% The Lua source files of the |luatodonotes| package should be in one of the +% searched directories. +% You can modify the path in your \TeX{} configuration or using environment +% variables. +% You can query kpathsea for a file using the default \TeX{} search path with: +% \begin{verbatim} +% kpsewhich luatodonotes.lua\end{verbatim} +% Be sure to run |texhash| (as root if needed) after moving files inside the +% texmf tree. +% +% \subsubsection{The \texttt{debug} option} +% You can load the package with the option |debug| (see +% Section~\ref{subsecPackageOptions}). +% It gives some additional information in the console while running Lua\TeX{} +% and draws additional information into the output document. +% For example, the size of the computed areas, in which the labels are placed, +% is shown in the document. +% Depending on the chosen layout algorithm some intermediate steps of the +% algorithms are given. +% +% +% +% % % \subsection{Known issues} % \subsubsection{Package loading order} @@ -739,8 +815,8 @@ % only newer versions of latex driver for tikz supports the % |remember picture| option. % For additional info consult -% ''Section 9.2.2 Producing PDF Output'' in the tikz manual. -% \url{http://www.ctan.org/tex-archive/graphics/pgf/base/doc/generic/pgf/pgfmanual.pdf} +% ''Section 10.2.2 Producing PDF Output'' in the tikz manual. +% \url{http://mirror.ctan.org/graphics/pgf/base/doc/pgfmanual.pdf} % % % @@ -771,14 +847,43 @@ % \iffalse % \StopEventually{\PrintChanges\PrintIndex} % \fi -% \StopEventually{\PrintChanges} +% \StopEventually{\clearpage\pdfbookmark{Changes}{changes}\PrintChanges} % % \newpage % \section{Implementation} +% In this section only the source code of the LaTeX package file +% (|luatodonotes.sty|) is shown. +% The Lua code is contained in |luatodonotes.lua| and documented by comments +% inside this file. +% These comments are primarily describing technical aspects. +% Information about the implemented algorithms and some theoretical +% considerations can be found in the following documents: +% \begin{itemize} +% \item Kindermann, P., Lipp, F., and Wolff, A.: +% Luatodonotes: Boundary Labeling for Annotations in Texts. +% In: Duncan, C. and Symvonis, A. (eds.) Proc. 22nd Int. Sympos. Graph Drawing GD'14. +% LNCS, vol. 8871, pp. 76-88. Springer, Heidelberg (2014) +% \url{http://dx.doi.org/10.1007/978-3-662-45803-7_7} +% \item Lipp, F.: +% Boundary Labeling for Annotations in Texts. +% Master thesis, 2014. +% \url{http://www1.pub.informatik.uni-wuerzburg.de/pub/theses/2014-lipp-master.pdf} +% \end{itemize} % -% Identifies the package and loads the packages dependences. +% \subsection{Dependencies and definitions} +% Check if Lua\TeX{} is used. +% \changes{0.2}{2015/02/23}{Check if LuaTeX is used at begin of package} +% \begin{macrocode} +\RequirePackage{ifluatex} +\ifluatex\else + \PackageError{luatodonotes}{LuaTeX is required for this package. Aborting.}{% + This package can only be used with the LuaTeX engine\MessageBreak + (command `lualatex'). Package loading has been stopped\MessageBreak + to prevent additional errors.} +\fi +% \end{macrocode} +% Loads the packages dependencies. % \begin{macrocode} -\ProvidesPackage{luatodonotes}[2014/06/08] \RequirePackage{ifthen} \RequirePackage{xkeyval} \RequirePackage{xcolor} @@ -814,7 +919,7 @@ \newcommand{\@todonotes@interNoteSpace}{5pt} \newcommand{\@todonotes@noteInnerSep}{5pt} \newcommand{\@todonotes@routingAreaWidth}{0.4cm} -\newcommand{\@todonotes@minNoteWidth}{2.0cm} +\newcommand{\@todonotes@minNoteWidth}{1.0cm} \newcommand{\@todonotes@distanceNotesPageBorder}{0.5cm} \newcommand{\@todonotes@distanceNotesText}{0.2cm} \newcommand{\@todonotes@rasterHeight}{1cm} @@ -1162,67 +1267,27 @@ % \end{macrocode} % Setting variables to values given by package options. % \begin{macrocode} -\directlua{noteInnerSep = +\directlua{luatodonotes.noteInnerSep = string.todimen("\luatexluaescapestring{\@todonotes@noteInnerSep}")} -\directlua{noteInterSpace = +\directlua{luatodonotes.noteInterSpace = string.todimen("\luatexluaescapestring{\@todonotes@interNoteSpace}")} -\directlua{routingAreaWidth = +\directlua{luatodonotes.routingAreaWidth = string.todimen("\luatexluaescapestring{\@todonotes@routingAreaWidth}")} -\directlua{minNoteWidth = +\directlua{luatodonotes.minNoteWidth = string.todimen("\luatexluaescapestring{\@todonotes@minNoteWidth}")} -\directlua{distanceNotesPageBorder = +\directlua{luatodonotes.distanceNotesPageBorder = string.todimen("\luatexluaescapestring{\@todonotes@distanceNotesPageBorder}")} -\directlua{distanceNotesText = +\directlua{luatodonotes.distanceNotesText = string.todimen("\luatexluaescapestring{\@todonotes@distanceNotesText}")} -\directlua{rasterHeight = +\directlua{luatodonotes.rasterHeight = string.todimen("\luatexluaescapestring{\@todonotes@rasterHeight}")} % \end{macrocode} -% Set the variable for the positioning algorithm depending on the corresponding -% package option. -% \begin{macrocode} -\IfStrEqCase{\@todonotes@positioning}{% - {inText}{\directlua{positioning = positioningAlgos["inText"]}}% - {inputOrder}{\directlua{positioning = positioningAlgos["inputOrder"]}}% - {inputOrderStacks}{\directlua{positioning = - positioningAlgos["inputOrderStacks"]}}% - {sLeaderNorthEast}{\directlua{positioning = - positioningAlgos["sLeaderNorthEast"]}}% - {sLeaderNorthEastBelow}{\directlua{positioning = - positioningAlgos["sLeaderNorthEastBelow"]}}% - {sLeaderEast}{\directlua{positioning = - positioningAlgos["sLeaderEast"]}}% - {poLeaders}{\directlua{positioning = positioningAlgos["poLeaders"]}}% - {poLeadersAvoidLines}{\directlua{positioning = - positioningAlgos["poLeadersAvoidLines"]}}% - {sLeaderNorthEastBelowStacks}{\directlua{positioning = - positioningAlgos["sLeaderNorthEastBelowStacks"]}}}% - [\directlua{positioning = positioningAlgos["inputOrderStacks"]} - \PackageWarningNoLine{luatodonotes} - {Invalid value for parameter positioning: \@todonotes@positioning}] -% \end{macrocode} -% Set the variable for the splitting algorithm depending on the corresponding -% package option. -% \begin{macrocode} -\IfStrEqCase{\@todonotes@splitting}{% - {none}{\directlua{splitting = splittingAlgos["none"]}}% - {middle}{\directlua{splitting = splittingAlgos["middle"]}}% - {median}{\directlua{splitting = splittingAlgos["median"]}}% - {weightedMedian}{\directlua{splitting = splittingAlgos["weightedMedian"]}}}% - [\directlua{splitting = splittingAlgos["none"]} - \PackageWarningNoLine{luatodonotes} - {Invalid value for parameter split: \@todonotes@splitting}] -% \end{macrocode} -% Specify the requested leader type. -% \begin{macrocode} -\IfStrEqCase{\@todonotes@leadertype}{% - {s}{\directlua{leaderType = leaderTypes["s"]}}% - {opo}{\directlua{leaderType = leaderTypes["opo"]}}% - {po}{\directlua{leaderType = leaderTypes["po"]}}% - {sBezier}{\directlua{leaderType = leaderTypes["sBezier"]}}% - {os}{\directlua{leaderType = leaderTypes["os"]}}}% - [\directlua{leaderType = leaderTypes["opo"]} - \PackageWarningNoLine{luatodonotes} - {Invalid value for parameter leadertype: \@todonotes@leadertype}] +% Set the variables for the used algorithms and leader types depending on the +% corresponding package options. +% \begin{macrocode} +\directlua{luatodonotes.setPositioningAlgo("\luatexluaescapestring{\@todonotes@positioning}")} +\directlua{luatodonotes.setSplittingAlgo("\luatexluaescapestring{\@todonotes@splitting}")} +\directlua{luatodonotes.setLeaderType("\luatexluaescapestring{\@todonotes@leadertype}")} % \end{macrocode} % The following commands are used to detect the absolute positions of lines on % the page. @@ -1239,10 +1304,10 @@ % thus can collect the line positions in a Lua table. % \begin{macrocode} \newcommand{\@todonotes@lineposition}[3]{% - \directlua{linePositionsAddLine(#1,#2,#3)}% + \directlua{luatodonotes.linePositionsAddLine(#1,#2,#3)}% } \newcommand{\@todonotes@nextpage}{% - \directlua{linePositionsNextPage()}% + \directlua{luatodonotes.linePositionsNextPage()}% }% % \end{macrocode} % The following macro is used in \texttt{AtBeginShipout} to signal in the @@ -1260,11 +1325,11 @@ % debug mode. % \begin{macrocode} \if@todonotes@debugenabled - \directlua{todonotesDebug = true} + \directlua{luatodonotes.todonotesDebug = true} \newcommand{\@todonotes@AtBeginShipoutUpperLeft} {\AtBeginShipoutUpperLeftForeground} \else - \directlua{todonotesDebug = false} + \directlua{luatodonotes.todonotesDebug = false} \newcommand{\@todonotes@AtBeginShipoutUpperLeft} {\AtBeginShipoutUpperLeft} \fi @@ -1272,7 +1337,7 @@ % Initialise the script when all Lua variables are set according to the package % options. % \begin{macrocode} -\directlua{initTodonotes()} +\directlua{luatodonotes.initTodonotes()} % \end{macrocode} % Some definitions to highlight areas in text. % The first command is needed to accept control spaces (|\ |) in arguments for @@ -1301,7 +1366,7 @@ {% last line of area \def\todonotes@textmark@decoRight{}% \addtolength\todonotes@textmark@width{2pt}% - \directlua{processLastLineInTodoArea()}}% + \directlua{luatodonotes.processLastLineInTodoArea()}}% {\def\todonotes@textmark@decoRight{@todonotes@todoarea}% \addtolength\todonotes@textmark@width{4pt}}% \newcommand{\@todonotes@nodeNamePrefix}% @@ -1647,9 +1712,19 @@ \@todonotes@toks@sizecommand=\expandafter{\@todonotes@sizecommand}% % \end{macrocode} % We store the text that should be shown in this note into a box and copy this -% box to a variable in Lua. -% \begin{macrocode} - \savebox\@todonotes@notetextbox{\@todonotes@sizecommand\@todonotes@text}% +% box to a variable in Lua. The commands |\@parboxrestore|, |\@marginparreset|, +% |\@minipagefalse| and |\outer@nobreak| are copied from the definition of +% |\marginpar| in \LaTeX 2e to reset font settings, for example. +% This is important when a note is placed inside a theorem environment. +% \changes{0.2}{2015/02/20}{Reset font settings at begin of a todo note} +% \begin{macrocode} + \savebox\@todonotes@notetextbox{% + \@parboxrestore + \@marginparreset + \@todonotes@sizecommand\@todonotes@text% + \@minipagefalse + \outer@nobreak + }% % \end{macrocode} % Prepare parameters and add the note to the list in Lua. % \begin{macrocode} @@ -1663,7 +1738,7 @@ \else% \def\@todonotes@param@noteType{}% \fi% - \directlua{addNoteToList(\arabic{@todonotes@numberoftodonotes},% + \directlua{luatodonotes.addNoteToList(\arabic{@todonotes@numberoftodonotes},% \@todonotes@param@drawLeader,\luastringO{\@todonotes@param@noteType})}% }% % \end{macrocode} @@ -1771,10 +1846,8 @@ \checkoddpage% \ifoddpageoroneside% \@todonotes@currentsidemargin=\the\oddsidemargin% - \directlua{currentPageOdd = true}% \else% \@todonotes@currentsidemargin=\the\evensidemargin% - \directlua{currentPageOdd = false}% \fi\relax% % \end{macrocode} % We switch to the default catcodes of \LaTeX\ here. @@ -1788,29 +1861,29 @@ % So this has to be done inside |\AtBeginShipoutUpperLeft| (otherwise odd/even % page detection won't work). % \begin{macrocode} - \directlua{calcLabelAreaDimensions()}% + \directlua{luatodonotes.calcLabelAreaDimensions()}% % \end{macrocode} % Calculates the needed height for every note. % This has to be outside of the tikzpicture because it uses a savebox to compute % the height. % This box does not work in the tikzpicture. % \begin{macrocode} - \directlua{calcHeightsForNotes()}% has to be outside of tikzpicture + \directlua{luatodonotes.calcHeightsForNotes()}% has to be outside of tikzpicture \begin{tikzpicture}[remember picture,overlay] % \end{macrocode} % Reads the absolute coordinates of every note on the page and writes them to % the Lua objects. % \begin{macrocode} - \directlua{getInputCoordinatesForNotes()} + \directlua{luatodonotes.getInputCoordinatesForNotes()} % \end{macrocode} % Runs the positioning algorithm and actually draws the notes and leaders. % \begin{macrocode} - \directlua{printNotes()} + \directlua{luatodonotes.printNotes()} \end{tikzpicture}% % \end{macrocode} % Delete the drawn notes from the Lua lists and prepare for the next page. % \begin{macrocode} - \directlua{clearNotes()}% + \directlua{luatodonotes.clearNotes()}% \EndCatcodeRegime }% } diff --git a/Master/texmf-dist/source/lualatex/luatodonotes/luatodonotes.ins b/Master/texmf-dist/source/lualatex/luatodonotes/luatodonotes.ins index 779664abf56..1fc75094df2 100644 --- a/Master/texmf-dist/source/lualatex/luatodonotes/luatodonotes.ins +++ b/Master/texmf-dist/source/lualatex/luatodonotes/luatodonotes.ins @@ -1,5 +1,5 @@ %% -%% Copyright (C) 2014 by Fabian Lipp +%% Copyright (C) 2014-2015 by Fabian Lipp %% based on the todonotes package by %% Henrik Skov Midtiby %% @@ -17,13 +17,13 @@ \input docstrip.tex \keepsilent -\usedir{tex/latex/luatodonotes} +\usedir{tex/lualatex/luatodonotes} \preamble This is a generated file. -Copyright (C) 2014 by Fabian Lipp +Copyright (C) 2014-2015 by Fabian Lipp based on the todonotes package by Henrik Skov Midtiby @@ -41,6 +41,7 @@ and version 1.2 or later is part of all distributions of LaTeX version \generate{\file{luatodonotes.sty}{\from{luatodonotes.dtx}{package}}} +\catcode`~=11\relax % needed to write ~ in the following message \obeyspaces \Msg{*************************************************************} \Msg{* *} @@ -53,6 +54,15 @@ and version 1.2 or later is part of all distributions of LaTeX version \Msg{* path_point.lua *} \Msg{* inspect.lua *} \Msg{* *} +\Msg{* A suitable directory would be *} +\Msg{* texmf/tex/lualatex/luatodonotes *} +\Msg{* in your local texmf-tree. For example, on a Linux system *} +\Msg{* with TeX Live you can find the texmf-directory in your *} +\Msg{* home directory under ~/texmf or system-wide under *} +\Msg{* /usr/share/texmf. *} +\Msg{* Don't forget to run texhash after copying the files (as *} +\Msg{* root if installed system-wide). *} +\Msg{* *} \Msg{* To produce the documentation run the file todonotes.dtx *} \Msg{* through LaTeX. *} \Msg{* *} -- cgit v1.2.3