在考虑如何排除\items
Yossi Farjoun 最近活跃的问题时onlyitems? 如何从项目列表中选择特定项目,我想我会按照我第一个答案中建议的那样做:只需将它们注释掉。然而,这样做的语法很笨拙,所以我做了其他事情。
但是我想到了一种简单的注释方式,可以避免包comment
环境所verbatim
经历的笨拙语法和复杂解析:只需将所有 catcode 设置为“忽略”(即 9)。当然,您必须恢复它们,因此这应该在一个组中完成,并且由于当所有内容都被忽略时 TeX 无法看到组的结尾,因此您必须保持括号完整。
设置起来有点麻烦全部catcodes,但由于我已经在使用pgfkeys
,因此很自然地使用它的处理程序来为我执行循环。多字节字符系统的用户可能想要更改以下代码中键.list
的定义:utility/change all characters
\documentclass{article}
\usepackage{pgfkeys,pgffor}
\pgfkeys{
/comment/.is family, /comment,
utility/set catcode/.code 2 args = {\catcode#1=#2},
utility/ignore character code/.style = {utility/set catcode = {#1}{9}},
utility/verbatim character code/.style = {utility/set catcode = {#1}{12}},
utility/change all characters/.style = {utility/#1 character code/.list = {0,...,255}},
ignore all characters/.style = {utility/change all characters = ignore},
all characters verbatim/.style = {utility/change all characters = verbatim},
restore braces/.style = {
utility/set catcode = {`\{}{1},
utility/set catcode = {`\}}{2}
}
}
\def\ignoreallcharacters{\pgfkeys{/comment/.cd, ignore all characters}}
\def\allcharactersverbatim{\pgfkeys{/comment/.cd, all characters verbatim}}
\def\restorebraces{\pgfkeys{/comment/.cd, restore braces}}
\begin{document}
\noindent
The following is ignored.
{
\expandafter\ignoreallcharacters\restorebraces
This stuff should all be ignored.
}
\noindent
This should be printed again. Now we have verbatim text:
{
\tt
\expandafter\allcharactersverbatim\restorebraces
This should be verbatim. This should have a large space before it.
}
\noindent
And normal text again.
\end{document}
作为奖励,做同样的事情来获得逐字文本并不难。再多做一点工作可能会让事情看起来更好(例如,做相当于\obeyspaces
和\obeylines
而不是将它们打印为“其他”字符),但原则是存在的。
所以,我的问题是:这种注释/逐字输入方法有什么缺点?即使是 Knuth,在 TeXbook 中,也没有建议这样做。(他确实指出,这种类方法不允许使用不平衡的括号,但将restore braces
其他一些字符对转换为组分隔符并不难,然后我们看起来就像\verb
通常那样。)
答案1
LaTeX 命令\verb
已经实现了您正在做的事情:每个特殊字符都分配有类别代码 12,以便可以打印,但分隔符除外,它接收类别代码 2(组结束)以结束这些分配的范围。
它的功能更多:空格字符被分配到类别 13 并定义为\
(它不会在换行符处消失)除非\verb*
被调用。其他字符被激活以断开连字(例如,西班牙语连字的反引号)。
环境comment
由包定义逐字verbatim
它以不同于 LaTeX 内核的方式实现环境:它分配 catcodes 类似\verb
并逐行读取文本,将其存储在通常排版其内容的宏中,但可以重新定义以将其丢弃(这就是它的作用comment
)。特殊输入\end
后跟括号中的环境名称将停止处理。
您的代码不会尊重输入中的换行符,并且需要终止符。当然它可以改进,但我几乎不认为它比传统方法更有效。