使用 LuaLaTeX、TeXlive 2024、Linux。
编辑:正如 David 在接受的答案中所写,这不需要 Lua 回调。但我将保留这个问题,因为其他用户可能会尝试做类似的事情,而不需要预先存在的文本定义"
。
我的应用程序涉及文本(而不是数学或图表)。我与人工编辑器交换纯文本文件,偶尔"
会有一些杂乱的内容。双引号在英语对话中被广泛使用。TeX 处理它们的方式"
与文字处理器(编辑器使用)处理它们的方式不同。
TeX 连字符总是设置"
为右侧双花括号。这不是我想要的。虽然我可以"
从tlig
列表中删除,但这还不够。我想要做的是每当"
遇到时都写一条消息。然后,保留"
原位(不花括号)。
我可以通过创建一个活动字符来编写消息"
。但是我不能让它就位
"
,因为它会无限运行。
我可以用我为此目的创建的另一个 Unicode 字符替换 active "
,该字符是 的副本"
。这解决了问题(几乎):我可以编写消息,当打印到纸上时,我可以看到"
那里。但是因为替换字符实际上不是"
机器人,所以 PDF 检查器可能会标记它。这超出了 TeX 的范围。
查看各个部分的代码,texmf-dist/tex/luatex
我发现有一种something.sub
方法,允许通过回调替换字形。听起来就像我需要的。唉,我不是一个合格的程序员,不知道如何使用它。
梅威瑟:
\documentclass{article} % compile with lualatex
\usepackage{fontspec}
\begin{document}
\catcode`\"=13 % straight double quotes now active.
\def"{\typeout{EEEEEK}º} % message, and subtitute with something else.
Hello, "World."\par
% I used the degree symbol as substitute character, because they have
% similar metrics in Latin Modern Roman. In my own usage, I use a different
% character, specifically created for the purpose (custom font).
% That character is identical to " but at a different Unicode location.
% At this point I would like to use a Lua callback for the finished paragraph,
% and revert the substitute back to ".
I said, "Hello," previously.
% Do it again.
\end{document}
注意:在文档主体中,我不需要"
babel 或 polyglossia 快捷方式,也不\char"HHHH
需要宏或数学。
尽管之前曾有人询问过使用 LuaLaTeX 进行字符替换,但现有的问题似乎都没有解决主动字符的问题。
答案1
LaTeX 提供了访问直引号的命令
\documentclass{article} % compile with lualatex
\usepackage{fontspec}
\begin{document}
\catcode`\"=13 % straight double quotes now active.
\def"{\typeout{EEEEEK}\textquotedbl} % message, and subtitute with something else.
Hello, "World."\par
% I used the degree symbol as substitute character, because they have
% similar metrics in Latin Modern Roman. In my own usage, I use a different
% character, specifically created for the purpose (custom font).
% That character is identical to " but at a different Unicode location.
% At this point I would like to use a Lua callback for the finished paragraph,
% and revert the substitute back to ".
I said, "Hello," previously.
% Do it again.
\end{document}