令牌寄存器中的逐字文本

令牌寄存器中的逐字文本

如何在 token 寄存器中添加逐字文本(我想在 toks 寄存器中积累代码片段并将它们打印在附录中)。在下面的 MWE 中,如果您替换逐字文本,则会失败。

\documentclass{article}
\begin{document}
  \newtoks\test
  \test={one }
  \test=\expandafter{\the\test test}
  \the\test
\end{document}

答案1

编辑:由于我们在包中添加了逐字功能,因此处理逐字文本变得更加容易。要实现此功能,您需要2011 年 8 月 15 日之后xparse的版本。我使用了标记列表而不是标记,但这基本无关紧要。xparse

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\addverb}{m+v}
  { \tl_put_right:Nn #1 { #2 } }
\NewDocumentCommand{\useverb}{m}
  {
    \exp_args:Nx \scantokens
      { \token_to_str:N \verb + \tl_to_str:N #1 + }
  }
\tl_new:N \test
\ExplSyntaxOff
\begin{document}
  \addverb\test+%&#a  b c\+
  \addverb\test?+-*?
  \useverb\test
\end{document}

答案2

问题在于,\verb通过使第一个字符处于活动状态,然后使用该字符来结束恢复其所做的所有字体更改和类别代码更改的组。

\documentclass{article}
\begin{document}
  \newtoks\test
  \test={\verb~one~ }
  \test=\expandafter{\the\test test}
  \the\test
\end{document}

由于~已经处于活动状态,因此此方法有效。但是,这种方法用处不大,因为 的主要用途\verb是避免转义%或 之类的内容&。这在这里行不通,因为当您将它们放入标记寄存器中时,它们会被标记化。相反,您应该只使用\texttt

答案3

我会将代码写入外部文件,并在需要时重新读取它。它可以避免这个问题,而且如果你多次添加大量材料,速度会快得多。基于filecontentsVerbatimOut的东西fancyvrb,但允许有多个环境,它们都写入同一个文件:


代码:

% codewrite.sty
\RequirePackage{fancyvrb}

\newcommand*\CodeOut{\FV@Environment{}{CodeOut}}

\newwrite\@codewrite
% Or to save an output handle:
%\let\@codewrite\FV@OutFile

\newcommand*\CodeOpenFile[1]{%
    \immediate\openout\@codewrite #1\relax
    \def\CodeOpen@File{#1}%
}

\def\FVB@CodeOut{%
    \@bsphack
    \begingroup
    \FV@UseKeyValues
    \FV@DefineWhiteSpace
    \def\FV@Space{\space}%
    \FV@DefineTabOut
    \def\FV@ProcessLine{\immediate\write\@codewrite}%
    \let\FV@FontScanPrep\relax
    %% DG/SR modification begin - May. 18, 1998 (to avoid problems with ligatures)
    \let\@noligs\relax
    %% DG/SR modification end
    \FV@Scan
}
\def\FVE@CodeOut{\endgroup\@esphack}

\newcommand*\ReadCode{\immediate\closeout\@codewrite\input{\CodeOpen@File}}


\DefineVerbatimEnvironment{CodeOut}{CodeOut}{}

使用示例:

\documentclass{article}

\usepackage{codewrite}

\CodeOpenFile{\jobname.cod}

\begin{CodeOut}
   Test
\end{CodeOut}

\begin{document}

\begin{CodeOut}
\begin{verbatim}
    test%^&$%\relax
\end{verbatim}
\end{CodeOut}

\ReadCode

\end{document}

可能已经有一个包可以做到这一点。请注意,您可以使用该包将文件的内容捕获到宏中catchfile

相关内容