评论/逐字的简单实现:缺点?

评论/逐字的简单实现:缺点?

在考虑如何排除\itemsYossi 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后跟括号中的环境名称将停止处理。

您的代码不会尊重输入中的换行符,并且需要终止符。当然它可以改进,但我几乎不认为它比传统方法更有效。

相关内容