我正在编写一个.dtx
可以生成多文件的文件,这是我的最小工作示例。
% \iffalse
%<*driver>
\ProvidesFile{my.dtx}[2022/05/17 3.1a mytest]
\documentclass{ltxdoc}
\usepackage{unicode-math}
\begin{document}
\DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
% \begin{macrocode}
%<filea|fileb> test
% \end{macrocode}
如果有是 unicode-math
包中,我有输出:
如果有不是·unicode-math` 包中,我有输出:
我们可以看到竖线|
变成了j
。unicode-math
为什么会出现这种情况?如何解决?非常感谢。
答案1
正如评论中部分解释的那样,问题在于doc
包“硬编码”的数学代码值|
。(反过来又由ltxdoc
documentclass 加载)
通常该角色处于位置 6A......
作为临时的解决方法,您可以修补命令......
\documentclass{ltxdoc}
\usepackage{unicode-math}
\usepackage{etoolbox}
\begin{document}
\makeatletter
\patchcmd{\mod@math@codes}{"226A}{"227C}{}{}
\makeatother
\begin{macrocode}
%<filea|&-+:=fileb> test
% \end{macrocode}
\end{document}
或者,如果您不想自己陷入同样的陷阱并动态计算值:
\documentclass{ltxdoc}
\usepackage{unicode-math}
\usepackage{etoolbox}
\begin{document}
\ExplSyntaxOn
\cs_set_protected:Npn \definepatchvertmathcode:n #1 {
\cs_set_protected:Npn \patchvertmathcode {
\mathcode `\| = #1
}
}
\cs_generate_variant:Nn \definepatchvertmathcode:n {x}
\definepatchvertmathcode:x {\int_eval:n{
\mathcode`\| - (\mathcode`\| - "800) / "1000 * "1000 + "2000
}}
\ExplSyntaxOff
\makeatletter
\apptocmd{\mod@math@codes}{\patchvertmathcode}{}{}
\makeatother
\begin{macrocode}
%<filea|&-+:=fileb> test
% \end{macrocode}
\end{document}
0x2000 + a % 0x1000
(解释:代码通过计算新值为,将第 4 位数字从原来的数字“替换”为 2(mathbin 类),其中a%0x1000
计算为a-floor(a/0x1000)
,floor(a/0x1000)
计算为round((a-0x800)/0x1000)
,a
是 的旧数学代码|
。)
注意,必须执行代码开始{document}之后因为 unicode-math 设置仅在那里完成。
备注:该doc
包由 LaTeX 团队维护,希望很快修复错误。
答案2
我认为它应该在改变数学设置的包中修复,即在这种情况下的 unicode-math,就像这样的包需要调整其他代码(如果它涉及数学而不是相反)。doc
自 1992 年以来就有一个钩子,声称它“硬连线东西”是不太公平的,它已经把它精确地放进去,\mod@math@codes
以便需要不同设置的设置可以调整它。
作为一种不需要 etoolbox\makeatletter
或其他操作的解决方法,无论文档是否使用 unicode-math 运行,以下内容都足够了:
\AddToHook{package/unicode-math/after}{%
\AddToHook{cmd/mod@math@codes/after}{\mathcode`\|="227C }}
但我同意,最终应该为 unicode-math 添加一些明确的支持,例如上面的内线。