我正在使用 TeX Live (MacTeX) 2023 并进行所有更新(截至今天早上)。考虑两个名为packageone.sty
和 的包packagetwo.sty
。packageone.sty
包含 的重新定义\vec
以包含带星号的版本。packagetwo.sty
包含 的修改后的重新定义,vec
以使无星号和带星号的版本相同,当且仅当packageone.sty
未加载时。出于某种原因,\vec
每个包中的自定义命令无法从主文档中看到,我不明白为什么。在 中定义的其他命令packagetwo.sty
可以从主文档中看到。
一方面,过去两天我一直在努力理解这一点,并没有发现任何明显的错误,因为略有不同的 MWE 版本都可以正常工作。另一方面,我感觉自己不知为何忽略了一些显而易见的事情。
如果尚未加载,我可以通过packagetwo
加载来获得所需的结果(但这需要对两个新定义进行相同的定义,这在本例中并不是什么大问题。它们在这里的不同仅仅是为了测试目的)。我原本希望不进行加载,但至少我现在有一个调试策略来弄清楚为什么这个提取的 MWE 不能像我预期的那样工作。packageone
\vec
packagetwo
packageone
这是包含两个包的 MWE。
% !TEX program = lualatexmk
% !TEX encoding = UTF-8 Unicode
\begin{filecontents*}{packageone.sty}
\RequirePackage[g]{esvect}
\RenewDocumentCommand{\vec}{ s m e{_^} }%
{%
\IfBooleanTF{#1}
{%
\vv{#2}%
\IfValueT{#4}%
{\sp{\,#4\vphantom{\smash[t]{\big|}}}}
}%
{%
\symbfit{#2}
\IfValueT{#4}%
{\sp{#4\vphantom{\smash[t]{\big|}}}}
}%
\IfValueT{#3}%
{\sb{#3\vphantom{\smash[b]{|}}}}
}%
\end{filecontents*}
\begin{filecontents*}{packagetwo.sty}
\IfPackageLoadedTF{packageone}
{}%
{%
\RequirePackage[g]{esvect}
\NewDocumentCommand{\foo}{}{Hello.}
\RenewDocumentCommand{\vec}{ s m }
{%
\IfBooleanTF{#1}
{%
\vv{#2}%
}%
{%
\vv{#2}%
}%
}%
}%
\NewDocumentCommand{\lhsmomentumprinciple}{ s }%
{%
\Delta
\IfBooleanTF{#1}%
{%
\vec*{p}
}%
{%
\vec{p}%
}%
\sb{\symup{sys}}%
}%
\NewDocumentCommand{\rhsmomentumprinciple}{ s }%
{%
\IfBooleanTF{#1}%
{%
\vec*{F}%
}%
{%
\vec{F}%
}%
\sb{\symup{sys,net}}\,\Delta t%
}%
\NewDocumentCommand{\momentumprinciple}{ s }%
{%
\IfBooleanTF{#1}%
{%
\lhsmomentumprinciple* = \rhsmomentumprinciple*%
}%
{%
\lhsmomentumprinciple = \rhsmomentumprinciple%
}%
}%
\end{filecontents*}
\documentclass{article}
\usepackage{unicode-math}
\usepackage{packageone}
\usepackage{packagetwo}
\begin{document}
1 \( \vec*{E} \)\par
2 \( \vec{E} \)\par
\IfPackageLoadedTF{packagetwo}
{%
3 \( \momentumprinciple* \)\par
4 \( \momentumprinciple \)\par
5 \foo \par
}%
{}%
\end{document}
答案1
调试此类问题的方法是通过在各处植入来找出定义发生变化的地方\ShowCommand
:
\documentclass{article}
\usepackage{unicode-math}
\renewcommand\vec{blub} % from package 1
\ShowCommand\vec
\renewcommand\vec{duck} % from package 2
\ShowCommand\vec
\begin{document} %what happens here??
\ShowCommand\vec
xxx
\end{document}
这将给出如下答案(在终端或日志中):
> \vec=\long macro:
->blub.
<argument> \vec
> \vec=\long macro:
->duck.
<argument> \vec
> \vec=\protected macro:
->\Umathaccent fixed 7\symoperators "020D7\scan_stop: .
<argument> \vec
因此,显然定义\begin{document}
再次发生变化,并将\Umath
unicode-math 指向为“罪魁祸首”。如果您想了解更多信息,可以检查 begindocument 钩子(使用\ShowHook{begindocument}
,或使用 unicode-math 和 begindocument 搜索答案。或者您begindocument
也可以简单地重新定义。