![可以定义活动字符,但不能在 \def 内定义?](https://linux22.com/image/469542/%E5%8F%AF%E4%BB%A5%E5%AE%9A%E4%B9%89%E6%B4%BB%E5%8A%A8%E5%AD%97%E7%AC%A6%EF%BC%8C%E4%BD%86%E4%B8%8D%E8%83%BD%E5%9C%A8%20%5Cdef%20%E5%86%85%E5%AE%9A%E4%B9%89%EF%BC%9F.png)
这是我之前的问题的后续:检测下一个字符的 catcode?
"
我想要做的是:计算文档主体中使用的数量。我不将其用于"
数学、babel 快捷方式或 Unicode 字符等目的。仅用于对话引用(小说写作、英语)。
我搜索了各种软件包,发现它polyglossia
有gloss-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
。也许这些宏做了一些神奇的事情?是的!所以这里有一些有效的东西,可能对其他人有用:
- 创建
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
找到它。
- 在文档类(或序言)中:
\newcounter{dblq}
\AtBeginDocument{\RequirePackage{dblq}}
- 下面是另一个说明其用法的 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 快捷方式,所以我不知道这是否会干扰它们。
编辑:根据评论中的建议进行修改。