我经常在自己和不太了解 LaTeX 的人之间传输文件,以便进行编辑。到目前为止,我已经设法控制了大多数 TeX 特有的怪异现象(感谢 utf-8 编码)。但我被百分号 % 难住了。
我希望检测文档主体中是否使用了未转义的 %(序言中允许)。如果使用了,则计算其存在次数。在文档末尾,如果计数超过零,我可以在日志文件中打印一条消息。
此 MWE 代码执行计数部分(我省略了消息):
\documentclass{article} % Compile using lualatex.
\newcounter{pctcount}
\begin{document}
\begingroup
\lccode`\~="0025
\lowercase{\endgroup\gdef~{\stepcounter{pctcount}\%}}
\catcode`\%=13
This line % has an unescaped percent.\par
And also % here.\par
pctcount=\arabic{pctcount}\par
\end{document}
本质上,它将 % 从注释字符更改为宏。我的问题是:我还希望它保留其作为注释字符的功能,以便它既可以增加计数器,又可以作为注释使用。
我尝试过各种魔术,例如使用\catcode
临时将注释代码 14 分配给未使用的字符(例如通用货币符号)。没有任何乐趣,如果我随意输入太多代码,除了远处恶魔般的笑声。
在 lualatex 中可以实现吗?Lua 代码可以接受。
我现在正在做的是通过 BASH 脚本扫描 *tex 文件。
答案1
你不需要 Lua 来实现这一点,它可以用普通的 LaTeX 来实现,但它不是一种好用、干净、易于理解的方法。这是基于这个答案,即将行的余数作为参数。我建议你阅读一下这个答案,因为它比我解释得更好。
下一个技巧是重新定义“%”来做一些事情,在本例中,就是踩计数器。
\par
但请注意,如果您使用来结束段落,整个方法似乎会失败并出现奇怪的错误。如果您只是使用一个空白行来结束段落,则它可以正常工作。
\documentclass{article}
\begin{document}
\newcounter{pctcount}
\newcommand*{\newlinecommand}[2]{%
\newcommand*{#1}{%
\begingroup%
\escapechar=`\\%
\catcode\endlinechar=\active%
\csname\string#1\endcsname%
}%
\begingroup%
\escapechar=`\\%
\lccode`\~=\endlinechar%
\lowercase{%
\expandafter\endgroup
\expandafter\def\csname\string#1\endcsname##1~%
}{\endgroup#2\space}%
}
%%% USAGE:
\newlinecommand{\emphline}{\emph{#1}}
\newlinecommand{\incrementpcount}{\stepcounter{pctcount}}
First words \emphline rest of line
some more text
% this would fail if it was after 'catcode' \par
\catcode`\%=13
\def%{\incrementpcount}
This line % has an unescaped percent.
And also % here.
It is the percent sign which is a problem, though\par
This is a new paragraph
I want a literal percent here: \% yay, percent sign
pctcount=\arabic{pctcount}
\end{document}