为什么在主文档中看不到这些来自包的自定义命令?

为什么在主文档中看不到这些来自包的自定义命令?

我正在使用 TeX Live (MacTeX) 2023 并进行所有更新(截至今天早上)。考虑两个名为packageone.sty和 的包packagetwo.stypackageone.sty包含 的重新定义\vec以包含带星号的版本。packagetwo.sty包含 的修改后的重新定义,vec以使无星号和带星号的版本相同,当且仅当packageone.sty未加载时。出于某种原因,\vec每个包中的自定义命令无法从主文档中看到,我不明白为什么。在 中定义的其他命令packagetwo.sty可以从主文档中看到。

一方面,过去两天我一直在努力理解这一点,并没有发现任何明显的错误,因为略有不同的 MWE 版本都可以正常工作。另一方面,我感觉自己不知为何忽略了一些显而易见的事情。

如果尚未加载,我可以通过packagetwo加载来获得所需的结果(但这需要对两个新定义进行相同的定义,这在本例中并不是什么大问题。它们在这里的不同仅仅是为了测试目的)。我原本希望不进行加载,但至少我现在有一个调试策略来弄清楚为什么这个提取的 MWE 不能像我预期的那样工作。packageone\vecpackagetwopackageone

这是包含两个包的 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} 再次发生变化,并将\Umathunicode-math 指向为“罪魁祸首”。如果您想了解更多信息,可以检查 begindocument 钩子(使用\ShowHook{begindocument},或使用 unicode-math 和 begindocument 搜索答案。或者您begindocument也可以简单地重新定义。

相关内容