diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/nicetext/niceverb.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/nicetext/niceverb.sty | 796 |
1 files changed, 793 insertions, 3 deletions
diff --git a/Master/texmf-dist/tex/latex/nicetext/niceverb.sty b/Master/texmf-dist/tex/latex/nicetext/niceverb.sty index 823093a1020..22e0ad3aa2a 100644 --- a/Master/texmf-dist/tex/latex/nicetext/niceverb.sty +++ b/Master/texmf-dist/tex/latex/nicetext/niceverb.sty @@ -1,756 +1,1546 @@ \NeedsTeXFormat{LaTeX2e}[1994/12/01] -\ProvidesPackage{niceverb}[2010/03/23 v0.32 + +\ProvidesPackage{niceverb}[2010/03/29 v0.4 + minimize doc markup (UL)] + + %% Copyright (C) 2009, 2010 Uwe Lueck, + %% http://www.contact-ednotes.sty.de.vu + %% -- author-maintained in the sense of LPPL below -- + %% + %% This file can be redistributed and/or modified under + %% the terms of the LaTeX Project Public License; either + %% version 1.3a of the License, or any later version. + %% The latest version of this license is in + %% http://www.latex-project.org/lppl.txt + %% We did our best to help you, but there is NO WARRANTY. + %% + %% Please report bugs, problems, and suggestions via + %% + %% http://www.contact-ednotes.sty.de.vu + %% + %% === Switching Category Codes === + %% v0.3 introduces `\AssignCatCodeTo' and `\MakeNormal'. + %% + %% |\CatCode{\<character>}| + %% (or simply |\CatCode\<character>|) + %% saves one token per use and works when the category code + %% of \qtd{&`} (``single left quote") has changed. + \newcommand*{\CatCode}{\catcode`} + % \newcommand*{\CatCode}[1]{\catcode`#1 } %% no better 2010/02/27 + %% With |\AssignCatCodeTo{<number>}{\<char>}|, + %% `\CatCode' may still be useful for displaying + %% (debugging or playing). + %% Note that `\<char>' is the {\it second} argument here. + \newcommand*{\AssignCatCodeTo}[2]{\catcode`#2=#1\relax} + %% |\MakeLetter\<char>| is used for \emph{private letters}, i.e., + %% to allow <char> in ``internal", non-user control sequences + %% ({\it\TeX book} Chap.\,3). + %% |\MakeOther| is just a different implementation of + %% \LaTeX's \cs{@makeother}. + \newcommand*\MakeLetter{\AssignCatCodeTo{11}} + \def \MakeOther {\AssignCatCodeTo{12}} + %% ... overriding 'fifinddo' if ... %% TODO 2010/03/12 + %% + %% |\MakeActive\<char>| just revives the meaning of <char> + %% it had most recently + %% (as an &\active character ... + %% maybe ``Undefined control sequence" unless ...) + %% This is fine for reviving 'niceverb' functionality + %% after having disabled it by `\MakeNormal'\linebreak[0]---provided + %% no other package used <char> actively in the meantime ... + \providecommand*{\MakeActive}{\AssignCatCodeTo\active} %% used v0.3 + %% We take a copy |\MakeActiveHere| of `\MakeActive' + %% as the latter may become a dangerous thing for compatibility + %% with 'hyperref'. + \@ifdefinable\MakeActiveHere{% + \let\MakeActiveHere\MakeActive} + %% <- TODO aliascid + elsewhere 2010/03/12 + %% |\MakeActiveLet\<char><macro name>| activates <char> + %% and then gives it the meaning of <macro name>. + \newcommand*{\MakeActiveLet}[2]{%% cf. \@sverb/\do@noligs (doc.sty) + \MakeActiveHere#1% %% 2010/03/12 + \begingroup + \lccode`\~`#1\relax \lowercase{\endgroup \let~#2}} + %% We take a copy |\MakeActiveLetHere| as well. + \@ifdefinable\MakeActiveLetHere{% + \let\MakeActiveLetHere\MakeActiveLet} + %% %% |\MakeAlign\&| can be used to restore the meaning of `&' after we + %% %% have made it `\active'. + %% % \providecommand*{\MakeAlign} {\AssignCatCodeTo4} + %% We use the ``underscore" as a private letter + %% (the \LaTeX2 Project Team likes it as well). + %% Its usual meaning can be restored by |\MakeNormal\_| + %% For restoring the usual category codes of \TeX's special + %% characters later, we store them now. + %% (I.e., these characters are listed in the macro `\dospecials' + %% that expands to + %% $$\mbox{\tt\def\do{\string\do\unskip\string}\dospecials}$$ + %% their category codes are + %% {\AssignCatCodeTo{6}{\#}% + %% \AssignCatCodeTo{3}{\$}%% fifinddo-interference!? TODO 2010/02/27 + %% \AssignCatCodeTo{4}{\&}%% fifinddo-interference!? TODO 2010/02/27 + %% \def\do#1{\def\do##1{, + %% \the\CatCode##1}\the\CatCode#1}\dospecials} + %% respectively; ``end of line", ``ignored", ``letter", ``other", and + %% ``invalid" are missing---cf. {\it \TeX book} Chap.\,7.) + \def\do#1{\expandafter + \chardef \csname normal_catcode_\string#1\expandafter \endcsname + \CatCode#1\relax} + \dospecials + %% Tests: + %% ``normal category code" of `\' is + %% \expandafter\the\csname normal_catcode_\string\\\endcsname, + %% ``normal category code" of `$' is + %% \expandafter\the\csname normal_catcode_\string\$\endcsname; + %% ``normal category code" of `&' is + %% \expandafter\the\csname normal_catcode_\string\&\endcsname.%%% + %% \footnote{\LaTeX's \cs{nfss@catcodes} is similar, + %% but it makes space-like characters ignored. + %% Also cf. 'ltfinal.dtx'. + %% TODO: &\RestoreNormalCatcodes.} %% 2010/03/06 + %% + %% Here we switch to the ``underscore" as a ``letter" indeed + %% (for the rest of the package): + \MakeLetter\_ + + % \newcommand*{\make_iii_other}{\MakeOther\\\MakeOther\{\MakeOther\}} + %% <- replaced 2009/04/05 + %% |\MakeNormal\<char>| saves you from remembering ... + \newcommand*{\MakeNormal}[1]{% + \@ifundefined{\norm_catc_str#1}% + {\MakeOther#1}% + {\AssignCatCodeTo{\csname\norm_catc_str#1\endcsname}#1}} + \newcommand*{\norm_catc_str}{normal_catcode_\string} + %% TODO add ^^I and ^^M + %% We take a copy |\MakeNormalHere| of `\MakeNormal' as + %% with `\MakeActive'. + \@ifdefinable\MakeNormalHere{\let\MakeNormalHere\MakeNormal} + %% + %% === Robustness by &\IfTypesetting === + %% It seems we need some own ways to achieve various + %% compatibilities---using |\IfTypesetting{<if>}{<unless>}|. + %% It also saves some `\expandafter's. + \providecommand*{\IfTypesetting}{% + % \relax + %% This `\relax' suppressed ligatures of single right quotes! + %% %% removed 2010/03/23 + \ifx \protect\@typeset@protect + \expandafter \@firstoftwo + \else \expandafter \@secondoftwo \fi} + %% + %% === &\NVerb === + %% `\begin_min_verb' is a beginning shared by some macros here. + %% It begins like \LaTeX's `\verb', apart from the final `\tt'. + \newcommand*{\begin_min_verb}{% + \relax \ifmmode \hbox \else \leavevmode\null \fi + \bgroup \tt} + %% |\NVerb<char><code><char>| + \newcommand*{\NVerb}{% + \_no_nice_meta_verb_false \nice_maybe_meta_verb} + %% |\HardNVerb<char><code><char>| does not recognize meta-variables: + \newcommand*{\HardNVerb}{% + \_no_nice_meta_verb_true \nice_maybe_meta_verb} + \newif\if_no_nice_meta_verb_ + \newcommand*{\nice_maybe_meta_verb}[1]{% + %% Mainly avoid `\verb''s noligs list which overrides definitions + %% of some active characters, while 'cmtt' doesn't have any + %% ligatures anyway. + \IfTypesetting{% + \begin_min_verb + \let\do\MakeOther \dospecials + %% Turn off 'niceverb' specials: + \MakeOther\|\MakeOther\`\MakeOther\'% + \if_no_nice_meta_verb_\MakeOther\<\fi + \MakeActiveLetHere #1\niceverb_egroup + \verb@eol@error %% TODO change message 2009/04/09 + }{\string\NVerb \string#1}} + %% 2009/04/11: about `etc.' [preceding a box!? 2010/03/14] + \newcommand*{\niceverb_normal_egroup}{\egroup \ifmmode\else\@\fi} + \@ifdefinable\niceverb_egroup + {\let\niceverb_egroup\niceverb_normal_egroup} + %% + %% === Single Quotes Typeset Meta-Code === + %% |\LQverb| will be a ``permanent alias" + %% for the active left single quote. + %% + %% The verbatim feature must not act when another single left + %% quote is ahead---we assume a double quote is intended then + %% (thus the left quote feature does not allow to typeset + %% something verbatim that starts with a single left quote). + %% Rather, double quotes should be typeset then. + %% In page headers, a `\protect' may be in the way. + %% (A hook for `\relax'ing certain things in + %% `\markboth' and `\markright' would have been an alternative.) + \MakeActive\` + \newcommand*{\LQverb}{% + \IfTypesetting{\lq_double_test}{\protect`}} + \MakeOther\` + \newcommand*{\lq_double_test}{% + %% This test settles the next catcode, so better switch to ``other" + %% in advance (won't harm if left quote isn't next): + \begingroup + \let\do\MakeOther \dospecials + \MakeOther\|%% 2010/03/09! + \futurelet\let_token \lq_double_decide} + \newcommand*{\lq_double_decide}{% + \ifx\let_token\LQverb + \endgroup + ``\expandafter \@gobble + %% Corresponding right quotes will become ``other" due to + %% having no space at the left. + %% TODO to be changed with 'wiki.sty'. + \else + \ifx\let_token\protect + \expandafter\expandafter\expandafter \lq_double_decide_ii + \else + \endgroup + \expandafter\expandafter\expandafter \NVerb + \expandafter\expandafter\expandafter \'% + \fi + \fi} + %% `\lq_double_decide_ii' continues test behind `\protect'. + \newcommand*{\lq_double_decide_ii}[1]{% + \futurelet\let_token \lq_double_decide} + %% + %% === Ampersand (or &\cstx) Typesets Meta-Code === + %% |\CmdSyntaxVerb| will be a permanent alias for the active `&'. + \MakeActive\& + \newcommand*{\CmdSyntaxVerb}{% + \IfTypesetting{% + \begin_min_verb + %% v0.3 moves the previous line from &\cmd_syntax_verb + %% %% <- shows bug is fixed 2010/03/09 + %% where it is too late to establish private letters + %% according to next line which was in `\begin_min_verb' + %% earlier---an important bug fix! + \MakeLetter\@\MakeLetter\_% + \cmd_syntax_verb + }{\protect&\string}} + \MakeNormal\& + \newcommand*{\cmd_syntax_verb}[1]{% + \string#1\futurelet\let_token \after_cs} + %% However, `&' (or `\CmdSyntaxVerb') + %% may fail with private letters + %% (there should be a hook for them), %% TODO 2010/02/28 + %% especially in \emph{macro arguments} %% 2010/03/05 + %% and with 'hyperref' in titles of %% 2010/03/11 + %% \emph{sections bearing \cs{label}s}, + %% so we provide something like |\cs{<characters>}| from 'doc.sty'. + \DeclareRobustCommand*{\cs}[1]{% + \begin_min_verb \backslash_verb #1\egroup} + \newcommand*{\backslash_verb}{\char`\\} + %% Moreover, typing `&\par' in ``short" \emph{macro arguments} + %% fails, you better type `\cs{par}' then. Likewise, + %% `\cs{if<letters>}' and `\cs{fi}' is safer in case + %% you want to skip some part of the documentation + %% (e.g., a package option skips commented code) + %% by \cs{if}`<letters>'\cs{fi}. + %% Finally, there will be PDF bookmarks support for `\cs' + %% rather than for a real `&' or `\CmdSyntaxVerb' analogue like + %% |\cstx{<charcters>}*[<opt>]{<mand>}| as follows. + \DeclareRobustCommand*{\cstx}[1]{% %% corr. 2010/03/17 + \begin_min_verb \backslash_verb #1\futurelet\let_token \after_cs} + \newcommand*{\after_cs}{% + \ifcat\noexpand\let_token a\egroup \space + \else \expandafter \decide_verb \fi} + \newcommand*{\test_more_verb}{\futurelet\let_token \decide_verb} + \newcommand*{\decide_verb}{% + \jumpteg_on_with\bgroup\braces_verb + \jumpteg_on_with[\brackets_verb + \jumpteg_on_with*\star_verb + \egroup} + %% CAUTION/TODO wrong before (... if cmd without arg + %% use \ then or choose usual verb... + %% or \MakeLetter\( etc. ... or \xspace + \newcommand*{\jumpteg_on_with}[2]{% + \ifx\let_token#1\do_jumpteg_with#2\fi} + %% TODO cf. 'xfor', 'xspace' (&\break@loop); + %% `\DoOrBranch#1...#1' or so. %% found 2010/03/05 + \def\do_jumpteg_with#1#2\egroup{\fi#1} + \def\braces_verb#1{\string{#1\string}\test_more_verb} + \def\brackets_verb[#1]{[#1]\test_more_verb} + \def\star_verb*{*\test_more_verb} + %% not needed with \Auto... OTHERWISE useful in args! + %% %%2010/03/15: + %% As 'latex.ltx' has `\endgraf' as a permanent alias for the + %% primitive version of `\par' and `\endline' for `\cr', + %% we offer |\endcell| as a replacement for the original `&': + \let\endcell& + %% + %% === Escape Character Typesets Meta-Code === + %% |\BuildCsSyntax| will be a permanent alias for the active escape + %% character. + \DeclareRobustCommand*{\BuildCsSyntax}{% + \futurelet\let_token \build_cs_syntax_sp} + \newcommand*{\build_cs_syntax_sp}{% + \ifx\let_token\@sptoken \else %% TODO ^^M!? + \expandafter \start_build_cs_syntax + \fi} + \newcommand*{\start_build_cs_syntax}[1]{% - \edef\string_built{\string#1}%% #1 may be active + + \edef\string_built{\string#1}% + +%% #1 may be active.---With Donald Arseneau's 'import.sty' (e.g.), + +%% \qtd{&_} may be needed to be `\active' with the meaning of + +%% `\textunderscore', therefore restoring its category code + +%% needs some more care than with v0.32 and earlier: + + \edef\before_build_cs_sub{\the\CatCode\_}% + \MakeLetter\_\MakeLetter\@%% CAUTION, cf. ... + \test_more_cs} + \newcommand*{\test_more_cs}{% + \futurelet\let_token \decide_more_cs} + \newcommand*{\decide_more_cs}{% + \ifcat\noexpand\let_token a\expandafter \add_to_cs + \else - \MakeNormalHere\_\MakeOther\@% + +% \MakeNormalHere\_ + +%% Restoring \qtd{&_} more carefully with v0.33 + +%% (`\begingroup' ... `\endgroup'!?): + +%% %% 2010/03/27 + + \CatCode\_\before_build_cs_sub + + \MakeOther\@% + \expandafter \in@ \expandafter + {\csname \string_built \expandafter \endcsname + \expandafter}\expandafter{\niceverbNoVerbList}% + \ifin@ + \csname \string_built + \expandafter\expandafter\expandafter \endcsname + \else + \begin_min_verb \backslash_verb\string_built + \expandafter\expandafter\expandafter \test_more_verb + \fi + \fi} + %% TODO such \if nestings with ifthen!? + %% cf.: + % \let\let_token,\typeout{\meaning\let_token} + %% TEST TODO fuer xspace!? (\ifin@) + \newcommand*{\add_to_cs}[1]{% + \edef\string_built{\string_built#1}\test_more_cs} + %% + %% |\AutoCmdSyntaxVerb| starts, |\EndAutoCmdSyntaxVerb| \emph{ends} + %% ``auto mode." + \newcommand*{\AutoCmdSyntaxVerb}{% + \MakeActiveLetHere\\\BuildCsSyntax} + \newcommand*{\EndAutoCmdSyntaxVerb}{\CatCode\\\z@} + %% |\NormalCommand{<characters>}| executes `\<characters>' + %% in ``auto mode." + \newcommand*{\NormalCommand}{} \let\NormalCommand\@nameuse + %% %% 2010/03/11: + %% Once I may want to use this feature in {\it Wikipedia}-like + %% section titles as supported by 'makedoc', yet I cannot really + %% apply the present feature soon, so this must wait ... + %% (There is a special problem with `\newlabel' and 'hyperref' ...) + %% + %% Former tests: + % \futurelet\LetToken\relax \relax + % \show\LetToken \typeout{\ifcat\noexpand\LetToken aa\else x\fi} + %% + %% |\niceverbNoVerbList| is the list of macros that will be + %% \emph{executed} instead of being typeset. + \newcommand*{\niceverbNoVerbList}{% + \begin\end\item\verb\EndAutoCmdSyntaxVerb\NormalCommand + \section\subsection\subsubsection} %% TODO!? + %% |\AddToMacro{\niceverbNoVerbList}{<macros>}| can be used to + %% add <macros> to that list. + \providecommand*{\AddToMacro}[2]{% %% TODO move to ... 2010/03/05 + \expandafter \def \expandafter #1\expandafter {#1#2}} + %% <- was very wrong 2010/03/18 + +%% Hey, or just |\AddToNoVerbList{<macros>}|: %% 2010/03/28 + +\newcommand*{\AddToNoVerbList}{\AddToMacro\niceverbNoVerbList} + +%% + %% ``Auto mode" probably ain't mean a thing if it ain't invoked using + %% \[|\AutoCmdInput{<file>}|\] for typesetting <file> in ``auto mode:" + \newcommand*{\AutoCmdInput}[1]{% + %% I am not yet sure whether `\input' etc. should be in the exception + %% list permanently: %% TODO 2010/03/18 + \begingroup + \AddToMacro\niceverbNoVerbList{\ProvidesFile\endinput}% + %% <- TODO? 2010/03/18 + \AutoCmdSyntaxVerb + \input{#1}% + \EndAutoCmdSyntaxVerb + \endgroup + } + %% + %% === Meta-Variables === + %% |\MetaVar<var-id>>| will be a permanent alias for the active \qtd{&<}. + \def\MetaVar#1>{% + \mbox{\normalfont\itshape $\langle$#1\/$\rangle$}} + %% TODO offer without angles as well + %% As opposed to 'ltxguide.cls', this works outside verbatim as well. + %% + %% === Hash Mark is Code === + %% |\HashVerb<digit>| will be a permanent alias for the active hash mark. + \newcommand*{\HashVerb}[1]{{\tt\##1}} + %% + %% === Single Right Quotes for &\textsf === + %% |\RQsansserif| will be a permanent alias for the active single + %% right quote. + %% + %% The basic problem with the ``single right quote feature" + %% is that a single right quote may be meant to be an apostrophe. + %% This is certainly the case at the right of a letter. + %% On the other hand, we assume that it is \emph{not} an apostrophe + %% (i)~in vertical mode (opening a new paragraph), + %% (ii)~after a horizontal skip. + %% + %% For page headers, in expanding without typesetting, + %% the expansion of `\RQsansserif' must contain another active + %% single right quote.{\sloppy\par} + \MakeActive\' + \newcommand*{\RQsansserif}{% + \IfTypesetting{\niceverb_rq_sf_test}{\protect'}} + \MakeOther\' + %% Another macro just to avoid more sequences of `\expandafter': + \newcommand*{\niceverb_rq_sf_test}{% + \ifhmode + \ifdim\lastskip>\z@ + \expandafter\expandafter\expandafter \DoRQsansserif + \else + \ifnum\niceverb_spacefactor + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \DoRQsansserif + \else '\fi + \fi + \else \ifvmode + \expandafter\expandafter\expandafter \DoRQsansserif + \else '\fi + \fi} + %% |\DoRQsansserif| %% 2010/03/10 + %% is \emph{another} (possible) alias for the + %% active single right quote, see below. + \MakeActive\' + \@ifdefinable\DoRQsansserif + {\def\DoRQsansserif#1'{\textsf{#1}}} + \MakeOther\' + %% The following cases are typical and cannot be decided by the + %% previous criteria: + %% (i)~parenthesis, (ii)~footnotes and after ``horizontal" + %% environments like `\[<math>\]', (iii)~section titles, + %% (iv)~`\noindent'. + %% We introduce some dangerous tricks---redefinitions of + %% % \LaTeX's internals `\@footnotetext' and `\@sect' + %% %% <- 2010/03/16 -> + %% \LaTeX's internal `\@sect' and of \TeX's primitives + %% `\noindent' and `\ignorespaces' as well as by + %% a signal `\spacefactor' value of 1001. + %% In page headers, \LaTeX\ equips the single right quote with the + %% meaning of `\active@math@prime' which must be overridden. + \newcommand*{\nvAllowRQSS}{% + \MakeActiveLetHere\'\RQsansserif + \niceverb_ignore} %% 2010/03/16 + %% These and the entire right quote functionality are + %% activated by %% removed todo 2010/03/10 + %% \[|\nvRightQuoteSansSerif| + %% \mbox{\quad and disabled by\quad} + %% |\nvRightQuoteNormal|\]---at + %% `\begin{document}'---where we collect previous settings---or + %% later: + \AtBeginDocument{% + \edef\before_niceverb_parenthesis{\the\sfcode`\(}% + \let \before_niceverb_ignore \ignorespaces %% 2010/03/16 + \let \before_niceverb_sect \@sect + \let \before_niceverb_noindent \noindent} %% 2010/03/08 + %% We assume that `\@sect' has the same + %% % We assume that `\@footnotetext' and `\@sect' have the same + %% parameters there as in \LaTeX\ + %% (even if redefined by another package, like 'hyperref'). + \def\niceverb_sect#1#2#3#4#5#6[#7]#8{% + \before_niceverb_sect{#1}{#2}{#3}{#4}{#5}{#6}% + [{\protect\nvAllowRQSS #7}]% + {\protect\nvAllowRQSS #8}} + %% 2010/03/20: + \newcommand*{\niceverb_spacefactor}{\spacefactor=1001\relax} + \newcommand*{\niceverb_noindent}{% + \before_niceverb_noindent \niceverb_spacefactor} + \newcommand*{\niceverb_ignore}{% + \ifhmode \niceverb_spacefactor \fi \before_niceverb_ignore} + %% + %% Here are the main switches: + \newcommand*{\nvRightQuoteSansSerif}{% + \MakeActiveLet\'\RQsansserif + \sfcode`\(=1001 %% enable in parentheses 2009/04/10 + %% I also added \HardNVerb+\sfcode`/=1001+ in the preamble + %% of 'makedoc.tex'. %% 2010/03/15 + % \let\@footnotetext\niceverb_footnotetext + \let\ignorespaces\niceverb_ignore %% 2010/03/16 + \let\@sect\niceverb_sect + \let\noindent\niceverb_noindent} %% 2010/03/08 + \newcommand*{\nvRightQuoteNormal}{% + \MakeNormal\'% %% 2010/03/21 + \sfcode`\(=\before_niceverb_parenthesis\relax + \let\ignorespaces\before_niceverb_ignore %% 2010/03/16 + \let\@sect\before_niceverb_sect + \let\noindent\before_niceverb_noindent} %% 2010/03/08 + %% |\nvAllRightQuotesSansSerif| %% 2010/03/10 + %% (after `\begin{document}'!) + %% forces the `\textsf' feature + %% \emph{without} testing for apostrophes. You then must be + %% sure---DANGER! CARE!---to + %% use \qtd{&\rq} only for obtaining an apostrophe and the + %% double quote character \qtd{&"} for closing double quotes, + %% or our `\dqtd{<text>}' for the entire quoting. + \newcommand*{\nvAllRightQuotesSansSerif}{% + \nvRightQuoteNormal + \MakeActiveLet\'\DoRQsansserif} + %% I started v0.31 (signal `\sfcode'=1000, lowercase letters + %% get `\sfcode'=1001) because + %% \NVerb+\href{http://ctan.org/pkg/<pkg>}{<pkg>}+ failed. + %% However, what I actually needed was |\ctanpkgref{<pack-name>}|: + \DeclareRobustCommand*{\ctanpkgref}[1]{% + \href{http://ctan.org/pkg/#1}{\textsf{#1}}} + %% + %% === Command-Highlighting Boxes === + %% With v0.3, we include one kind of command syntax boxes + %% whose <content> is (in 'niceverb' syntax) + %% delimited as \GenCmdBox+|<content>|+. + %% %% 2010/03/14: + \newsavebox\niceverb_savebox + %% |\GenCmdBox<char><content><char>}| works like + %% `\NVerb<char><content><char>' except putting the latter's result + %% into a framed (or coloured or ...) box.{\sloppy\par} + \newcommand*{\GenCmdBox} {\_no_nice_meta_verb_false \gen_cmd_box} + %% |\HardVerbBox| is a variant of `\GenCmdBox' with the meta-variable + %% feature disabled + %% (for the documentation of the present package). + \newcommand*{\HardVerbBox}{\_no_nice_meta_verb_true \gen_cmd_box} + \newcommand*{\gen_cmd_box}{% + \bgroup + \let\niceverb_egroup\nice_collect_verb_egroup + \global %% TODO!? for \cmdboxitem 2010/03/15 + %% <- TODO replace \niceverb_egroup by parameter, + %% save one nesting level 2010/03/15 + \setbox\niceverb_savebox \hbox\bgroup + \if_no_nice_meta_verb_ + \expandafter \HardNVerb + \else \expandafter \NVerb \fi} + \newcommand*{\nice_collect_verb_egroup}{% + \egroup \egroup + \ifvmode \expandafter \VerticalCmdBox + \else \ifmmode \hbox \fi + \expandafter \InlineCmdBox \fi + {\box\niceverb_savebox}% + \niceverb_normal_egroup} + %% |\nvCmdBox| will be the permanent alias for \qtd{&|}. + \newcommand*{\nvCmdBox}{\GenCmdBox\|} + %% |\VerticalCmdBox{<content>}| + %% may eventually start a `decl' environment + %% as in 'ltxguide.cls', looking ahead for another \qtd{&|} + %% in order to (perhaps) append another row. + %% Another possibility is first to do some + %% \[`\if@nobreak\else \pagebreak[2]\fi'\] + %% etc. and then invoke `\InlineCmdBox'. + %% The user can choose later by some `\renewcommand'. + %% We do the perhaps most essential thing here + %% (again cf. `\begin_min_verb'):{\sloppy\par} + \newcommand*{\VerticalCmdBox}{\leavevmode\null\InlineCmdBox} + %% The command declaration boxes in the documentation of + %% Nicola Talbot's \ctanpkgref{datatool} + %% would be an especially nice realization of `\VerticalCmdBox'. + %% + %% |\InlineCmdBox{<content>}|, according to our idea, should not + %% change baseline skip, even with some `\fboxsep' and `\fboxrule'. + %% (However, it may be a good idea to increase the overall + %% normal baseline skip.) + %% We therefore replace actual height and depth of the content by + %% the height and depth of math parentheses. + \newcommand*{\InlineCmdBox}[1]{% + \bgroup + %% ... needed in math mode with `\begin_min_verb'. + \fboxsep 1pt + \kern\SetOffInlineCmdBoxOuter + \smash{\SetOffInlineCmdBox{\kern\SetOffInlineCmdBoxInner + \InlineCmdBoxArea{#1}% + \kern\SetOffInlineCmdBoxInner}}% + \mathstrut + \kern\SetOffInlineCmdBoxOuter + \egroup + } + %% The default choice for |\SetOffInlineCmdBox| is `\fbox': + \@ifdefinable\SetOffInlineCmdBox{\let\SetOffInlineCmdBox\fbox} + %% You can `\renewcommand' it to change `\fboxsep', `\fboxrule' + %% etc. or to use a `\colorbox' with the 'color' package, e.g., + %% I used the following setting so far: + %% %% 2010/03/10 + %% \begin{verbatim} + %% \RequirePackage{color} + %% \renewcommand*{\SetOffInlineCmdBox} + %% {\colorbox[cmyk]{.1,0,.2,.05}} + %% \end{verbatim} + %% |\SetOffInlineCmdBoxInner| enables controlling the inner + %% horizontal space to the box margin independently of + %% `\fboxsep'. + %% %% We set it to 0\,pt. as default (it is a macro only, + %% %% for a while). + \newcommand*{\SetOffInlineCmdBoxInner}{-\fboxsep\thinspace} + %% This choice is inspired by `\cstok' for ``boxed" things + %% in Knuth's 'manmac.tex' which formats {\it The \TeX book}. + %% %% <- 2010/03/10 + %% + %% |\SetOffInlineCmdBoxOuter| allows that the box hangs out into the + %% margin horizontally. + %% We set it to 0\,pt as default (it is a macro only, for a while). + \newcommand*{\SetOffInlineCmdBoxOuter}{\z@} + %% The height and depth of the frame should be the same for all + %% inline boxes, we think. + %% The present choice |\InnerCmdBoxArea| for the spacing + %% respects code characters rather than the height and depth + %% of the angle brackets that surround meta-variable names. + \newcommand*{\InlineCmdBoxArea}[1]{% + \smash{#1}\vphantom{gjpq\backslash_verb}} + %% \GenCmdBox+\cmdboxitem|<content>|+ is another variant of + %% `\GenCmdBox'. It should replace `\item[<content>]' in the + %% `description' environment. %% 2010/03/15 + \newcommand*{\cmdboxitem}{% + \bgroup + \let\niceverb_egroup\cmd_item_egroup + \global %% TODO!? 2010/03/15 + \setbox\niceverb_savebox \hbox\bgroup + \NVerb} + \newcommand*{\cmd_item_egroup}{% + \egroup \egroup \egroup + \item[\InlineCmdBox{\box\niceverb_savebox}]} + %% + %% === When 'niceverb' Gets Nasty === + %% These things are new with v0.3. + %% ==== Quotes ==== + %% %% WRONG 2010/03/05: + %% % The left quote feature for meta-code requires that the right quote + %% % feature---for replacing `\textsf'---is activated---no, rather: + %% % that the right quote \qtd{&'} is `\active'. + %% % + %% In order to get \emph{real} single quotes, you could use `\lq <text>\rq', + %% maybe appending a `\ ', but the code |\qtd{<text>}| may look better + %% and be easier to type. + \newcommand*{\qtd}[1]{`#1'} + %% However, here we get the problem that the left quote in + %% \NVerb\+\qtd{`<code>'}+ will be unable to switch into + %% verbatim mode entirely---then use `&', + %% e.g., \qtd{&\qtd{&&&&}} typesets \qtd{\qtd{&&}}, i.e., + %% the ampersand in single (non-verbatim) quotes. + % TODO \qtdverb!? alternative meaning for \LQverb!? 2010/03/06 + % rather rare, & takes less space 2010/03/09 + %% |\dqtd{<text>}| can be used for enclosing in \emph{double} quotes + %% with the dangerous `\nvAllRightQuotesSansSerif' (see above). + \newcommand*{\dqtd}[1]{``#1"} + %% + %% ==== 'hyperref' ==== + %% This is for\slash about compatibility with the 'hyperref' package. + %% (One preliminary thing: in doubt, don't load 'niceverb' earlier + %% than 'hyperref'.) %% TODO 2010/03/14 + %% + %% We need some substitutions for PDF bookmarks with + %% 'hyperref'. We issue them at `\begin{document}' when we know + %% if 'hyperref' is at work.\footnote{An alternative approach would be + %% using + %% \ctanpkgref{afterpackage} + %% by Alex Rozhenko.} + \AtBeginDocument{% + \@ifpackageloaded{hyperref}{% + \newcommand*{\PDFcstring}{% %% moved here 2010/03/09 + \134\expandafter\@gobble\string}% %% ASCII octal encoding + \pdfstringdefDisableCommands{% + \let\nvAllowRQSS\empty %% not \relax 2010/03/12 + %% 2010/03/12 + \MakeActiveLetHere\`\lq \MakeActiveLetHere\'\rq + \MakeActiveLetHere\&\PDFcstring + \def\cs{\134}% %% 2010/03/17 + }% + %% Moreover, in order to avoid spurious %% 2010/03/14 + %% \texttt{Label(s) may have changed} with 'hyperref', + %% a single right quote must be \emph{read} as active + %% by a `\newlabel' if and only if it has been active when + %% `\@currentlabelname' was formed.\footnote{This uses + %% \cs{@onelevelsanitize}, therefore &\protect doesn't + %% change the behaviour of ``active" characters.} + %% as `\active'. We use `\protected@write' as this cares for + %% `\nofiles'. `\@auxout' may be `\@partaux' for `\include'. + \newcommand*{\niceverb_aux_cat}[2]{% %% 2010/03/14 + \protected@write\@auxout{}{\string#1\string#2}}% + \renewcommand*{\MakeActive}[1]{% + \MakeActiveHere#1% + \niceverb_aux_cat\MakeActiveHere#1}% + \renewcommand*{\MakeActiveLet}[2]{% + \MakeActiveLetHere#1#2% + \niceverb_aux_cat\MakeActiveHere#1}% + \renewcommand*{\MakeNormal}[1]{% + \MakeNormalHere#1% + \niceverb_aux_cat\MakeNormalHere#1}% + }{}% + } + %% TODO doesn't 'babel' have the same problem? 2010/03/12 + %% ==== 'hyper-xr' ==== %% 2010/03/21 + %% With the 'hyper-xr' package creating links into external documents, + %% preceding `\externaldocument{<file>}' with + %% `\MakeActiveLet\&\CmdSyntaxVerb' may be needed. + %% I do not want to redefine something here right now as I + %% I have too little experience with this situation. + %% + %% ==== Turning off and on altogether ==== + %% These commands are new with v0.3. + %% + %% |\noNiceVerb| \emph{disables} all 'niceverb' features. + \newcommand*{\noNiceVerb} {\MakeNormal\`% + \MakeNormal\&% + \MakeNormal\<% + \MakeNormal\#% + \nvRightQuoteNormal + \MakeNormal\|} + %% |\useNiceVerb| \emph{activates} all the 'niceverb' features + %% (apart from ``auto mode"). + \newcommand*{\useNiceVerb}{\MakeActiveLet\`\LQverb + %% TODO to be changed with 'wiki.sty' v0.2 + \MakeActiveLet\&\CmdSyntaxVerb + \MakeActiveLet\<\MetaVar + \MakeActiveLet\#\HashVerb + \nvRightQuoteSansSerif + \MakeActiveLet\|\nvCmdBox} + %% + %% === Activating the 'niceverb' Syntax === + %% 'niceverb' features are activated at `\begin{document}' + %% so (some) other packages can be loaded \emph{after} 'niceverb'. + %% For v0.3, we do this after possible settings for + %% compatibility with 'hyperref'. + \AtBeginDocument{\useNiceVerb} + %% + %% === Leave Package Mode === + \MakeNormalHere\_ %% 2010/03/12 + \endinput + %% + %% === VERSION HISTORY === + + v0.1 2009/02/21 very first, sent to CTAN + v0.2 2009/04/04 ...NoVerbList: \subsubsection, \AddToMacro, + 2009/04/05 \SimpleVerb makes more other than iii + 2009/04/06 just uses \dospecials + 2009/04/08 debugging code for rq/sf, +\relax + 2009/04/09 +\verb@eol@error, prepared for new doc method, + removed spurious \makeat..., -\relax (ligature), + 2009/04/10 ('-trick + 2009/04/11 \@ after \SimpleVerb + 2009/04/14 noted TODO below + 2009/04/15 change v0.1 to 2009/02/21 + v0.30 2010/02/27 short, more explained, \AssignCatCodeTo, + use \MakeActive for re-activating, \MakeNormal + 2010/02/28 fixed @ and _ with & by moving \begin_min_verb; + replaced \lq by `; Capitals in Titles + 2010/03/05 \SimpleVerb -> \NVerb; + use \MakeActive + \MakeNormal; \rq -> '; + renamed some sections; \lq_verb -> \LQverb, + \niceverb_meta -> \MetaVar, + \param_verb -> \HashVerb + 2010/03/06 removed \MakeAlign; removed @ and _ todo below; + \NVerb makes ` and ' other; + \nvAllowRQSF allows ' in column titles, + 2010/03/08 \LQverb and & work in column titles, + \RQverb works with \noindent; + bookmark substitutions + 2010/03/09 extended notes on 'hyperref' (in)compatibility; + \MakeLetter\@ in \CmdSyntaxVerb only; + |...| implemented as \prepareCmdBox etc.! + 2010/03/10 \colorbox example, \thinspace; ltxguide!; + removed todo; ..._exec -> \DoRQsansserif; + minor doc changes in ``Nasty" + 2010/03/11 doc changes in ``Escape Character ..." and + ``Ampersand" + 2010/03/12 \niceverb_aux_cat, \MakeActiveHere etc., + \IfTypesetting, \noNiceVerb, \useNiceVerb, + corr. bracing mistake in \MakeNormal! + 2010/03/14 0.31 -> 0.3; \HardNVerb, \GenCmdBox, + \prepareCmdBox -> \nvCmdBox + 2010/03/15 \endcell; \cmdboxitem; remark on \sfcode`/ + 2010/03/16 corr. -> \endline; + advice on \cs{par}, \cs{if...}, \cs{fi}; + redefined \ignorespaces for RQ feature + 2010/03/17 corr. `\fututelet', corr. \cs PDF substitution + 2010/03/18 |\niceverbNoVerbList|, |\AddToMacro| etc.; + corr. \AddToMacro; + \lastskip-fix of \niceverb_ignore, + another fix of \niceverb_noindent + 2010/03/19 another fix of \niceverb_ignore: \spacefactor + 2010/03/20 ... again: \niceverb_spacefactor + + NOT DISTRIBUTED, just stored saved as separate version + + v0.31 2010/03/20 right quote feauture: letters get \sfcode=1001 + `column title' -> `page headers', \ctanpkgref + + NOT DISTRIBUTED, just stored as separate version + + v0.32 2010/03/21 taking best things from v0.30 and v0.31 + 2010/03/23 removed \relax from \IfTypesetting +SENT TO CTAN + + + +v0.4 2010/03/27 restoring `_' with "auto mode" safer + + 2010/03/28 \AddToNoVerbList + + 2010/03/29 note above, renamed v0.4 + |