带有百分号/回车符以外的内容的注释

带有百分号/回车符以外的内容的注释

据我所知,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}

相关内容