据我所知,LaTeX 的注释分别是一对字符与类别代码之间的内容:
- 14 (通常为
%
), - 5(通常是行尾)。
是否可以定义另一对字符(例如@*
),以便从输出中丢弃中间的所有内容?更明确地说,我想要输出:
foo @bar *baz
为:“foo baz”
请注意,我的问题不是如何定义类别 14 和 5 的字符:特别是,我不想@
属于类别 14,因为我不希望当前行后面的所有内容都从输出中丢弃。
答案1
您可以使第一个字符处于活动状态(catcode 13)并将其定义为宏。
\catcode`\@=\active
\def@#1*{}
TeX 会将 之后的所有内容匹配为@
,然后扩展到定义,即空白。如果您希望在和之间允许换行,请使用*
#1
\long\def
@
*
例如,它适用于foo @bar *baz
以下问题:
\documentclass{article}
\begin{document}
\catcode`\@=\active
\long\def@#1*{}
% Because I use \verb below for illustration and I'd like the character @ to be treated verbatim too.
\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&\do\#\do\^\do\_\do\%\do\~\do\@}
% ^ The above is the standard definition of \dospecials, with "\do\@" appended. Could also write:
% \let \dospecialsOld = \dospecials
% \def\dospecials{\dospecialsOld\do\@}
foo baz (typed \verb|foo baz|)
foo %bar
baz (typed \verb|foo %bar<newline>baz|)
foo @bar
*baz (typed \verb|foo @bar<newline>*baz|)
foo @bar *baz (typed \verb|foo @bar *baz|)
\smallskip
foo @bar* baz (typed \verb|foo @bar* baz|)
foo {} baz (typed \verb|foo {} baz|)
\end{document}
请注意,使用此定义,起始字符@
默认不能用于其他任何用途(除非再次更改其 catcode),就像通常的 catcode 一样,该字符%
不能用于注释以外的任何用途。(此外,对于特定的字符@
,请注意使用\makeatletter
和\makeatother
将破坏我们的定义,我们必须\active
再次将 catcode 设置为。)
%
还要注意,使用从-到行尾注释时跳过下一行前导空格的行为是不同的(要获得它,您必须将结束符放在*
空格后面):
答案2
如果 luatex 是可能的,你可以在 TeX 对输入进行标记之前对文本流进行替换,因此在你需要担心 catcodes 之前
\documentclass{article}
\makeatletter
\directlua{
function at_star_comment (s)
return string.gsub(s,'@[^*]*\@percentchar*','')
end
luatexbase.add_to_callback("process_input_buffer", at_star_comment, "comment between @ and *")
}
\makeatother
\begin{document}
foo @bar *baz
even mismatched braces \fbox{zz@ lose this brace} * this gets boxed}
\end{document}