可以定义活动字符,但不能在 \def 内定义?

可以定义活动字符,但不能在 \def 内定义?

这是我之前的问题的后续:检测下一个字符的 catcode?

"我想要做的是:计算文档主体中使用的数量。我不将其用于"数学、babel 快捷方式或 Unicode 字符等目的。仅用于对话引用(小说写作、英语)。

我搜索了各种软件包,发现它polyglossiagloss-dutch,它可以将一些重音字符设置为活动字符。这是在\def宏完成的。它看起来正是我需要的。令我惊讶的是,当我编写代码时,它可以工作不是\def,但当我编写代码时失败之内a \def(无法访问)。MWE 的工作方式如下:

\documentclass{article} % Compile using lualatex.
\usepackage{fontspec} % Less-minimal exaple would need this.
\defaultfontfeatures{} % Reset, to avoid tlig for this MWE.
\newcounter{dblq}
\def\shazam{} % Placeholder.

% To see the problem, uncomment/comment:

% Uncomment these 4 lines:
%\def\shazam{
%  \catcode`\"=13
%  \def "{”\stepcounter{dblq}}
%}

% And apply comment to these two lines:
\catcode`\"=13
\def "{”\stepcounter{dblq}}

\begin{document}
\shazam

"What in the world," he asked, "is happening here?"

\typeout{DBLQ=\arabic{dblq}}
\end{document}

原因lualatex是我只使用 utf-8 fontspec

我尝试了各种随机更改,例如删除空格、使用\let等。没有效果。使用 也失败了\AtBeginDocument

答案1

设置\catcode会影响输入中的字符到字符标记的转换,但对字符标记完全没有影响。

\def\shazam{
  \catcode`\"=13
  \def "{”\stepcounter{dblq}}
}

命令定义的主体已用 catcode 12 标记,"因此该\catcode设置不会影响这一点(但会影响后面的文本)并且\def "是语法错误。

\catcode`\"=13
\def\shazam{
  \def "{”\stepcounter{dblq}}
}

定义具有活动的命令"(即使在使用"时未处于活动状态) 。\shazam

答案2

在消化了 David 写的内容并重新检查了babel和部分的代码后polyglossia,我仍然感到困惑。他们的代码在宏中定义了活动字符,但这种方式对我来说不起作用。请理解,出于与原始问题无关的原因,我需要激活并定义字符\AtBeginDocument或可能\AfterEndPreamble(etoolbox)。

然后我恍然大悟:另一段代码是使用\usepackage或加载的\RequirePackage。也许这些宏做了一些神奇的事情?是的!所以这里有一些有效的东西,可能对其他人有用:

  1. 创建dblq.sty包含以下行的文件:
\ProvidesFile{dblq.sty}[2023/10/01 v0.01 LaTeX file (double quotes).]
\catcode`\"=13
\def "{”\stepcounter{dblq}}
\AtEndDocument{
  \catcode`\"=12
  \typeout{You used \arabic{dblq}\string ".}
}
\endinput

然后把它放到文档旁边,或者在命令行中mktexlsr找到它。

  1. 在文档类(或序言)中:
\newcounter{dblq}
\AtBeginDocument{\RequirePackage{dblq}}
  1. 下面是另一个说明其用法的 MWE。假设文件dblq.sty已经存在:
\documentclass{article}
% \usepackage{fontspec} % If building with lualatex.
\def\doesNotCount{"Hello World," they said.}
\newcounter{dblq}
\AtBeginDocument{
  \def\uni#1{No\obeyspaces} % This MWE only, pdflatex.
  % \def\uni#1{{\char"#1}\obeyspaces} % uncomment for lualatex
  \RequirePackage{dblq}
}
\begin{document}
\def\doesCount{"Hello Again," they said.}
\doesNotCount\par
\doesCount\par
"Hello to you, too," they replied.\par
"Deise is sch\"one," said Hans.\par
Finally, "\uni{2116} kidding!" they shouted.\par
\end{document}

这正确地计算了 8 个双引号。 中的那些\doesNotCount不计算在内,因为它们是在激活之前写入的。 活动字符不受影响\"o,也不计算在内。 虽然\uni可能没有必要,但我出于自己的目的使用它,所以我在这里写了它。

我不使用 babel/polyglossia 快捷方式,所以我不知道这是否会干扰它们。

编辑:根据评论中的建议进行修改。

相关内容