From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/moreverb/moreverb.dtx | 652 +++++++++++++++++++++++++++++ 1 file changed, 652 insertions(+) create mode 100644 macros/latex/contrib/moreverb/moreverb.dtx (limited to 'macros/latex/contrib/moreverb/moreverb.dtx') diff --git a/macros/latex/contrib/moreverb/moreverb.dtx b/macros/latex/contrib/moreverb/moreverb.dtx new file mode 100644 index 0000000000..3e6f06e2d7 --- /dev/null +++ b/macros/latex/contrib/moreverb/moreverb.dtx @@ -0,0 +1,652 @@ +% +% \iffalse +% +% Copyright (C) 1997 2002 2008 2011 by +% Robin Fairbairns +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either +% version 1.3c of this license or (at your option) any later +% version. The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of +% LaTeX version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The current maintainer of this work is Robin Fairbairns. +% +% This work consists of the source files moreverb.dtx, +% moreverb.ins +% and the derived files moreverb.sty, +% moreverb.pdf +% +% RCS information: +% +% $Id: moreverb.dtx,v 1.12 2011/04/18 19:03:28 rf10 Exp rf10 $ +% +% \section{Initially: identify the package} +% +% We use the same body for the \cs{ProvidesFile} as for the +% \cs{ProvidesPackage} command. +% +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +%<*dtx> +\ProvidesFile{moreverb.dtx} +% +%\ProvidesPackage{moreverb} + [2008/06/03 v2.3a +% `more' verbatim facilities% +%<*dtx> + moreverb source file% +% + ] +% \end{macrocode} +% Code to compile the thing using LaTeX2e +% +%<*driver> +\documentclass{ltxdoc} +% +\setcounter{errorcontextlines}{999} +% +\GetFileInfo{moreverb.dtx} +% +% The definition of \star in ltxdoc.cls is useless (bug report +% LaTeX/2117). \env is something I would like to have -- I'm +% not sure this definition is entirely kosher (in any case, why aren't +% all these things in doc.sty?) +% +\renewcommand\star{\texttt{*}} +\DeclareRobustCommand\env[1]{\cs{begin\char`\{#1\char`\}}} +% +\begin{document} + \title{The \textsf{moreverb} package\thanks{This file + has version number \fileversion, last + revised \filedate}} + \author{Robin Fairbairns (\small\texttt{rf10@cam.ac.uk})\\ + after\\ + Angus Duggan, Rainer Sch\"opf and Victor Eijkhout} + \date{\the\year-\ifnum\month<10 0\fi\the\month + -\ifnum\day <10 0\fi\the\day} + \maketitle + \tableofcontents + \DocInput{moreverb.dtx} +\end{document} +% +% +% \fi +% +% \CheckSum{402} +% +% \section{This package} +% +% This package uses the facilities provide by the \textsf{verbatim} +% package in the \LaTeXe{} \emph{tools} distribution to provide a +% number of things that were rejected as unnecessary in the +% development of that package. (Nevertheless, the tab-expansion code +% in this package responds to one of the FAQs of |comp.text.tex|) +% +% The package provides things in three broad areas: +% \begin{itemize} +% \item Tab expansion and related stuff, +% \item Line numbering, +% \item Miscellaneous: writing verbatim to a file (for example, for +% later re-input), and `boxed' verbatim. +% \end{itemize} +% +% \subsection{Tab expansion} +% +% The package enables you to specify the expected width of the +% tabulation, and also allows input of files containing tabs. +% +% \DescribeEnv{verbatimtab} +% +% \env{verbatimtab}\oarg{tab width} +% reproduces its body verbatim, with the tabs expanded to the given +% width (the default value is 8). +% +% \DescribeMacro{\verbatimtabinput} +% +% \cs{verbatimtabinput}\oarg{tab width}\marg{file name} +% is a file input version of the \texttt{verbatimtab} environment. +% +% \DescribeMacro{\verbatimtabsize} +% +% The size of the tabs is stored in \cs{verbatimtabsize}, and persists +% between uses of the environments. (I.e., an optional argument to +% one of them applies to all subsequent ones.) +% +% \noindent To replace the value other than by use of an optional +% argument, you need to say: +% +% \cs{renewcommand}\cs{verbatimtabsize}|{|\meta{value}\cs{relax}|}| +% +% There are no promises offered as to the performance if you omit the +% \cs{relax}! +% +% \subsection{Line numbering} +% +% Line numbering is often useful when reproducing code examples +% (useful, that is, for those of us who don't want to pretty-print +% such snippets). +% +% \DescribeEnv{listing} +% +% \env{listing}\oarg{interval}\marg{start line} numbers the lines of +% its body. The argument \meta{start line} specifies the starting +% line number. The optional argument \meta{interval} specifies the +% number of lines between numbered lines: that is, every line whose +% number \(=0\pmod{\mbox{\meta{interval}}}\) will be numbered in the +% output. (In addition, line number 1 will always be numbered.) The +% default value of the \meta{interval} is 1 (i.e., every line will be +% numbered). +% +% \DescribeEnv{listingcont} +% +% \env{listingcont} continues from the place where the last +% listing left off. +% +% The style in which the label is set can be altered, for either +% environment, by re-defining \cs{listinglabel}. Both environments +% also expand tabs. +% +% `\star' versions of both the listing environments are provided; +% these do the usual |verbatim*| thing of outputting spaces as +% `\verb*| |', but don't expand tabs. +% +% \DescribeMacro{listinginput} +% +% \cs{listinginput}\oarg{interval}\marg{start line}\marg{filename} +% is a file input version of listing. There is no `\star' form. +% +% \subsection{Miscellanea} +% +% \DescribeEnv{verbatimwrite} +% +% \env{verbatimwrite}\marg{filename} writes all text in its body to a +% file, the name of which it is given as an argument. +% +% \DescribeEnv{boxedverbatim} +% +% \env{boxedverbatim} puts the contents of a verbatim environment in a +% framing box. If you try to do this in a na\"\i ve way, you find +% that the verbatim lines have all become the width of the page, so +% that the box is, more often than not, a very poor fit to the text it +% surrounds. +% +% \DescribeEnv{verbatimcmd} +% +% The |verbatimcmd| environment was provided by the \LaTeX2.09 and +% early \LaTeXe{} versions of this package. However, its capabilities +% are now provided by |alltt|, which is defined by the \textsf{alltt} +% package, now part of the \LaTeX{} base distribution, and so +% |verbatimcmd| has been withdrawn. +% +% \StopEventually{} +% +% \section{The code of the package} +% +% \begin{macrocode} +%<*moreverb> +% \end{macrocode} +% +% \subsection{Initial code} +% +% Load the \textsf{verbatim} package if it's not already loaded. +% +% \begin{macrocode} +\@ifundefined{verbatim@processline}{\RequirePackage{verbatim}}{} +% \end{macrocode} +% +% \subsection{Writing to a file} +% +% \begin{environment}{verbatimwrite} +% \env{verbatimwrite}\marg{filename} writes all text in its body to a +% file, the name of which it is given as an argument. (This code was +% written by Rainer Sch\"opf.) +% +% Note that the code creates its own output stream at first use. +% (This is a conservation measure; if the user never uses +% \env{verbatimwrite}, no \cs{write} stream is created. An actual +% problematic use case appeared on tex.sx\dots) +% +% \begin{macrocode} +\def\verbatimwrite#1{% + \@ifundefined{verbatim@out}{\newwrite\verbatim@out}{}% + \@bsphack + \immediate\openout \verbatim@out #1 + \let\do\@makeother\dospecials + \catcode`\^^M\active \catcode`\^^I=12 + \def\verbatim@processline{% + \immediate\write\verbatim@out + {\the\verbatim@line}}% + \verbatim@start} +% \end{macrocode} +% \begin{macrocode} +\def\endverbatimwrite{% + \immediate\closeout\verbatim@out + \@esphack} +% \end{macrocode} +% \end{environment} +% +% \subsection{Tab expansion} +% +% We define a few auxiliary macros and counters for expanding tabs. +% They are used by the |listing| and |verbatimtab| environments. +% +% \begin{macrocode} +\newcount\tab@position \newcount\tab@size +% \end{macrocode} +% +% \cs{verbatimtabsize} used to be a counter, but that seems to me +% overkill (\LaTeX{} uses too many counters as it is\dots). +% +% \begin{macrocode} +\def\verbatimtabsize{8\relax} +% \end{macrocode} +% +% \begin{macro}{\@xobeytab} +% +% \cs{@xobeytab} puts enough spaces in to get us to the next nominal +% tab stop +% \begin{macrocode} +\def\@xobeytab{% + \loop + \toks@\expandafter{\the\toks@\@xobeysp}% + \advance\tab@position-1 + \ifnum\tab@position>0 \repeat +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@vobeytabs} +% \cs{@vobeytabs} initialises use of \cs{@xobeytab}. Needs to be +% executed within a group, as mustn't be allowed to leak out into the +% wide world. +% +% \begin{macrocode} +\begingroup + \catcode`\^^I=\active + \gdef\@vobeytabs{\catcode`\^^I\active\let^^I\@xobeytab}% +\endgroup +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\verbatim@tabexpand} +% \cs{verbatim@tabexpand}\meta{body of line}\cs{@nil} processes every +% character of a line by tail recursion, counting the characters and +% juggling things when a tab is encountered. (What used to be called +% `line imaging'\dots) +% +% \begin{macrocode} +\def\verbatim@tabexpand#1{% + \ifx#1\@nil +% \showthe\toks@ + \the\toks@ + \expandafter\par + \else + \ifx#1\@xobeytab + \@xobeytab + \else +% \end{macrocode} +% +% We can safely put \cs{@xobeysp} into the token register, since it +% does precisely what we need +% \begin{macrocode} + \toks@\expandafter{\the\toks@#1}% + \advance\tab@position\m@ne + \fi + \ifnum\tab@position=0 \tab@position\tab@size \fi + \expandafter\verbatim@tabexpand + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{listing} +% \env{listing}\oarg{interval}\marg{start line} +% +% Defines a verbatim environment with numbered lines; the optional +% argument \meta{interval} specifies the number of lines between +% numbered lines, and the argument \meta{start line} specifies the +% starting line. +% +% \begin{environment}{listingcont} +% \env{listingcont} +% +% Continues from the place where listing left off. The style in which +% the label is set can be altered by re-defining \cs{listinglabel}. +% +% `\star' versions of both environments are provided. +% +% \begin{macro}{\listing@line} +% \cs{listing@line} holds the current line number; its default value +% is 1, so one can merrily use |listingcont| throughout a document if +% there's but one stream of verbatim text being written. +% +% \begin{macrocode} +\newcount\listing@line \listing@line=1 +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\listing@step} +% \cs{listing@step} is another case where a counter used to be used, +% to no very obvious utility, but using up a valuable count register. +% Again, the value is modal; the trailing \cs{relax} is necessary. +% +% \begin{macrocode} +\def\listing@step{1\relax} +% \end{macrocode} +% \end{macro} +% +% Adding an \cs{hbox} in front of the line causes a line break, so +% I\footnote{The personal pronoun was present in the comments in the +% original version of this package; I'm not sure who it relates +% to~--- RF} go through this rigmarole to get the lines aligned +% nicely. I probably missed some obvious reason why \cs{hbox}es don't +% work\footnote{It's because an \cs{hbox} in vertical mode makes a +% complete paragraph in its own right; this problem could be dealt +% with in the fullness of time, but just now\dots}. +% +% \begin{macrocode} +\def\listinglabel#1{\llap{\small\rmfamily\the#1}\hskip\listingoffset\relax} +\def\thelisting@line{% + \setbox0\hbox{\listinglabel\listing@line}% + \@tempcnta=\listing@line + \divide\@tempcnta\listing@step \multiply\@tempcnta\listing@step + \ifnum\listing@line=\@ne + \unhbox0 + \else + \ifnum\@tempcnta=\listing@line + \unhbox0 + \else + \hskip\wd0 + \fi + \fi} +% \end{macrocode} +% +% \begin{macro}{\listingoffset} +% \cs{listingoffset} is the separation between the line number and the +% actual line being listed; default value is \verb|1.5em| +% \begin{macrocode} +\providecommand\listingoffset{1.5em} +% \end{macrocode} +% \end{macro} +% +% Define \cs{listing} simply to suck in parameters and then to use +% \cs{listingcont} +% +% \begin{macrocode} +\newcommand\listing[2][1]{% + \global\listing@line=#2\relax + \gdef\listing@step{#1\relax} + \listingcont} +% \end{macrocode} +% +% \cs{listingcont} is the business end of the two environments. +% +% \begin{macrocode} +\def\listingcont{% + \tab@size=\verbatimtabsize + \def\verbatim@processline{\tab@position\tab@size + \thelisting@line \global\advance\listing@line1 + \toks@{}% + \expandafter\verbatim@tabexpand\the\verbatim@line\@nil}% + \@verbatim\frenchspacing\@vobeyspaces\@vobeytabs\verbatim@start} +% \end{macrocode} +% +% Nothing special at the end of the two environments. +% +% \begin{macrocode} +\let\endlisting=\endtrivlist +\let\endlistingcont=\endtrivlist +% \end{macrocode} +% +% Now the same rigmarole for the `\verb+*+' versions. +% +% \begin{macrocode} +\expandafter\newcommand\csname listing*\endcsname[2][1]{% + \global\listing@line=#2\relax + \gdef\listing@step{#1\relax} + \csname listingcont*\endcsname} +\@namedef{listingcont*}{% + \def\verbatim@processline{% + \thelisting@line \global\advance\listing@line1 + \the\verbatim@line\par}% + \@verbatim\verbatim@start} +% \end{macrocode} +% +% Nobbut a bit of hassle in the name definitions for the end of the +% environments +% +% \begin{macrocode} +\expandafter\let\csname endlisting*\endcsname\endtrivlist +\expandafter\let\csname endlistingcont*\endcsname\endtrivlist +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% \begin{macro}{listinginput} +% \cs{listinginput}\oarg{interval}\marg{start line}\marg{filename} +% is a file input version of listing. +% +% \begin{macrocode} +\def\listinginput{% + \@ifnextchar[%] + {\@listinginput}% + {\@listinginput[1]}} +\begingroup + \catcode`\~=\active \lccode`\~=`\^^M \lccode`\N=`\N + \lowercase{\endgroup + \def\@listinginput[#1]#2#3{\begingroup + \global\listing@line=#2 + \gdef\listing@step{#1\relax} + \tab@size=\verbatimtabsize + \def\verbatim@processline{\tab@position\tab@size + \thelisting@line \global\advance\listing@line1 + \toks@{}% + \expandafter\verbatim@tabexpand\the\verbatim@line\@nil}% + \@verbatim\frenchspacing\@vobeyspaces\@vobeytabs + \def\verbatim@addtoline##1~{% + \verbatim@line\expandafter{\the\verbatim@line##1}}% + \openin\verbatim@in@stream=#3 + \ifeof\verbatim@in@stream + \PackageWarning{moreverb}{No file #3.}% + \else + \do@verbatimtabinput + \closein\verbatim@in@stream + \fi + \endtrivlist\endgroup + \@doendpe + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{verbatimcmd} +% \texttt{verbatimcmd} was a verbatim environment with the exception +% of the escape and grouping characters \verb+\+, \verb+{+, \verb+}+. +% This is (err) exactly the specification of the \texttt{alltt} +% environment, and that is in the \textsf{alltt} package that is now +% part of the base distribution. +% \begin{macrocode} +\def\verbatimcmd{% + \PackageError{moreverb}{The verbatimcmd environment is obsolete}% + {Use alltt (from the LaTeX required package + alltt) in place of verbatimcmd}% +} +\let\endverbatimcmd\relax +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{boxedverbatim} +% \texttt{boxedverbatim} puts the contents of a verbatim environment +% in a framing box. +% +% (Written by Victor Eijkhout.) +% +% \noindent Bug fixes: +% \begin{itemize} +% \item David Carlisle 1995-12-28, dealing with spacing issues (iirc) +% \item Moretn H\o gholm 2008-06-01, positioning of frame in lists +% \end{itemize} +% +% First, redefine `processline' to produce only a line as wide +% as the natural width of the line +% +% \begin{macrocode} +\def\boxedverbatim{% + \def\verbatim@processline{% + {\setbox0=\hbox{\the\verbatim@line}% + \hsize=\wd0 \the\verbatim@line\par}}% +% \end{macrocode} +% +% Now save the verbatim code in a box +% +% \begin{macrocode} + \@minipagetrue % DPC + \@tempswatrue % DPC + \@totalleftmargin\z@ % MH + \setbox0=\vbox\bgroup \verbatim +} +% \end{macrocode} +% +% At the end of the environment, we (umm) simply have to stick the +% results into a frame. +% +% \begin{macrocode} +\def\endboxedverbatim{% + \endverbatim + \unskip\setbox0=\lastbox % DPC +% \end{macrocode} +% +% Now everything's in the box, so we can close it\dots +% \begin{macrocode} + \egroup +% \end{macrocode} +% +% To change the code for centring, the next line needs a spot of +% hacking. +% \begin{macrocode} + \fbox{\box0}% +} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{verbatimtab} +% \env{verbatimtab}\oarg{tab width} +% is a verbatim environment which expands tab characters; the optional +% argument specifies the distance between tab stops. +% +% Executing \cs{obeylines} before looking for the optional argument +% prevents an empty first line of the environment becoming a \cs{par} +% token (this bug was reported by Werner Lemberg). +% \begin{macrocode} +\newenvironment{verbatimtab}{\obeylines\@verbatimtab}{\endtrivlist} +% \end{macrocode} +% +% Process the optional argument of the |verbatimtab|, now that we have +% protected ourselves from the dreaded \cs{par} tokens +% \begin{macrocode} +\newcommand\@verbatimtab[1][\verbatimtabsize]{% + \do@verbatimtab{#1}{% + \@verbatim\frenchspacing\@vobeyspaces\@vobeytabs\verbatim@start}% +} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\do@verbatimtab} +% +% Prepare a tabbing environment; \verb+#1+ is the value of the tab +% size (generally, originally, an optional argument), \verb+#2+ is the +% `startup commands' to execute once an appropriate definition of +% \cs{verbatim@processline} has been established: +% \begin{macrocode} +\def\do@verbatimtab#1#2{% + \tab@size=#1 + \def\verbatim@processline{\tab@position\tab@size + \toks@{}% + \expandafter\verbatim@tabexpand\the\verbatim@line\@nil}% + #2% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\verbatimtabinput} +% \cs{verbatimtabinput}\oarg{tab width}\marg{file name} +% is a file input version of the \texttt{verbatimtab} environment. +% +% We use the input stream acquired by the \textsf{verbatim} package; +% we did after all require it to be loaded. (One has to admit that +% the name of that stream isn't actually part of the package's defined +% interface, but on the other hand there's no particular likelihood +% that it will ever change.) +% +% We didn't (originally) use fancy features of \cs{newcommand} since +% the definition was inside a group, and hence global. So \dots\ +% `traditional' code to provide a command with an optional argument +% (which may no longer be necessary): +% +% \begin{macrocode} +\def\verbatimtabinput{% + \@ifnextchar[%] + {\@verbatimtabinput}% + {\@verbatimtabinput[\verbatimtabsize]}} +\begingroup +\catcode`\~=\active \lccode`\~=`\^^M \lccode`\N=`\N +\lowercase{\endgroup + \def\@verbatimtabinput[#1]#2{\begingroup + \do@verbatimtab{#1}{% + \@verbatim\frenchspacing\@vobeyspaces\@vobeytabs}% + \def\verbatim@addtoline##1~{% + \verbatim@line\expandafter{\the\verbatim@line##1}}% + \openin\verbatim@in@stream=#2 + \ifeof\verbatim@in@stream + \PackageWarning{moreverb}{No file #2.} + \else + \@addtofilelist{#2}% + \do@verbatimtabinput + \closein\verbatim@in@stream + \fi + \endtrivlist\endgroup\@doendpe}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\do@verbatimtabinput} +% Written-out (tail recursion) loop for reading the file +% \begin{macrocode} +\def\do@verbatimtabinput{% + \read\verbatim@in@stream to \verbtab@line + \ifeof\verbatim@in@stream + \else + \expandafter\verbatim@addtoline\verbtab@line + \verbatim@processline + \verbatim@startline + \expandafter\do@verbatimtabinput + \fi +} +% +% \end{macrocode} +% \end{macro} +% +% \Finale +% +\endinput +% +%% \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 \~} -- cgit v1.2.3