使用 unicode-math 将 docstrip 文件中的竖线更改为 j

使用 unicode-math 将 docstrip 文件中的竖线更改为 j

我正在编写一个.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` 包中,我有输出:

在此处输入图片描述

我们可以看到竖线|变成了junicode-math为什么会出现这种情况?如何解决?非常感谢。

答案1

正如评论中部分解释的那样,问题在于doc包“硬编码”的数学代码值|。(反过来又由ltxdocdocumentclass 加载)

通常该角色处于位置 6A......

图片来自 encguide.pdf

作为临时的解决方法,您可以修补命令......

\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 添加一些明确的支持,例如上面的内线。

相关内容