在定义中使用逐字逐句

在定义中使用逐字逐句

我实际上需要在定义中存储一些逐字文本,以便可以多次重复使用它。

以下是一段非常简短的片段:

% here I store verbatim text
\def\foo{
  bar \verb'baz' spam
}
% now I reuse it
\foo

根本不起作用。有什么想法吗?(\texttt对我来说不是解决方案)。

答案1

逐字逐句很难。

其工作方式\verb(以及逐字环境)相当棘手。

假设你写了\verb|\foo|。该\verb命令告诉 TeX 将各种特殊字符(例如\)视为普通字母,然后它将“参数”读\foo为四个字母的序列,然后将字符改回\特殊字符(省略各种细节......)。

但是 TeX 只“读取”每个字符一次,因此当 TeX 读取时\def\foo{bar \verb'\baz'},它会读取整个{...}参数它试图评估它,并且它读取它,关键的是,使用当时有效的特殊/非特殊定义。为什么这很重要?

您可能会认为,当您稍后展开 时\foo,TeX 会重新读取此参数,并\verb在此时发挥其魔力。但为时已晚:TeX 已经完成了它要做的所有读取工作,并决定\是一个特殊字符,因此这\baz是一个宏调用; 的值\foo存储为一些字母 'bar ',加上一个命令\verb、一个字母'、一个命令\baz和另一个字母'

所以:这就是为什么你写的内容没有像你预期的那样工作。你的目标是(在评论中的解释后添加的文本)有选择地包含和忽略文本。

其中一种方法是使用 LaTeX 中的“comment”包。例如:

\documentclass{article}
\usepackage{comment}
%\includecomment{comment} % uncomment this to see the {comment} contents
\begin{document}
This is some text.
\begin{comment}
This is more text.
\end{comment}
And this is a final sentence.
\end{document}

如果您搜索“Latex 练习”或“Latex 问题集”或类似的内容,您可能会找到更适合您特定问题的内容。但他们很可能会在幕后使用类似“评论”包的技术。


已编辑,根据评论,添加:

此外,如果您希望能够在命令行上打开或关闭此“注释”,那么您可以使用如下技术:

\documentclass{article}
\usepackage{comment}
\expandafter\ifx\csname includemycomments\endcsname\relax
\else
\includecomment{comment} % uncomment this to see the {comment} contents
\fi
\begin{document}
This is some text.
\begin{comment}
This is more text.
\end{comment}
And this is a final sentence.
\end{document}

在这种情况下(假设这是在名为的文件中comm.tex),您可以说pdflatex comm获取不带注释的版本,并pdflatex '\def\includemycomments{x}\input{comm}'获取带注释的版本(奇数\ifx命令测试\includemycomments宏是否已定义)。这是从命令行配置 LaTeX 文件内容的非常通用的技术。

Steven B. Segletes 建议使用一个框。它看起来如下:

\documentclass{article}
\newbox\answerbox
\def\answer{\setbox\answerbox=\vbox}
\newif\ifshowanswer
\expandafter\ifx\csname includemycomments\endcsname\relax
  \showanswerfalse
\else
  \showanswertrue
\fi
\begin{document}
This is some text.
\answer{This is \verb|verb\ati~m| text}
And this is a final sentence.
\ifshowanswer
\box\answerbox
\fi
\end{document}

这就是一般的想法(如果您想知道,与上面的“逐字记录为何很难”的解释相比,关键区别在于 的参数被\answer读作 的参数vbox,它不是宏,而是 TeX 原语)。如果您想做一些更复杂的事情,我建议您找到一个可以做到这一点的包——我敢打赌有一个用于管理练习答案集的 LaTeX 包,只需用 google 一下就可以找到它。

相关内容