隐藏地方的术语定义?

隐藏地方的术语定义?

这个问题与我之前的一个问题相关增加参数和全局 xparse 宏的嵌套级别?

我使用修改后的版本\defsym我使用了egreg 给出的这个答案回答上面的第二个问题。但是我遇到的问题是命名法定义有时会失败,因此缺少一些符号。对于 MWE 检查egreg 的回答以及下面的代码片段。

我既不明白它到底什么时候会失效,也想不出解决办法。当符号第一次使用时,似乎会发生这种情况,例如\phantom{\Ak}

\begin{align}
\Uk[j]
\end{align}

环境align似乎探测了该行的长度,因此第一次使用是不可见的。这可以通过\typeout在符号定义中使用 a 来看到,它将在日志中出现两次。

在后面插入上述代码片段之一\begin{document}egreg 的 MWE导致符号从命名法中消失。

  1. 我想了解为什么\nomenclature不起作用,例如在以下毫无意义的例子中$\phantom{\nomenclature{$\alpha$}{Foo}}$。我不明白为什么在此示例中将某些内容写入文件会失败。
  2. 当它失败时是否有某种系统?
  3. 如何修复?是否可以检查是否\nomenclature已成功将符号写入 nlo 文件?

答案1

这里的问题是对齐环境会对amsmath材料进行两次传递,第一次是测量,第二次是进行实际排版。因此,在测量期间会评估进行注释并在第一次出现时将条件设置为 false 的代码,但这样创建的框会被直接丢弃。

的问题\phantom类似:排版框被丢弃,\write指令无法在垂直列表中“迁移”以便在正确的时间执行。简单地说,不要第一次将此类命令放在 中\phantom

对于amsmath环境,我们必须与测量过程进行交互。

\documentclass{article}
\usepackage{xparse}
\usepackage{nomencl}
\usepackage{xcolor}

\usepackage{amsmath}

\makeatletter
\def\buergi@ifmeasuring#1#2{%
  \ifmeasuring@
    \expandafter\@firstoftwo
   \else
     \expandafter\@secondoftwo
  \fi{#1}{#2}}
\makeatother

% colorize to distinguish original and renewed command
\ExplSyntaxOn
% #1 = command name
% #2 = definition
% #3 = default optional argument
% #4 = description
\NewDocumentCommand{\defsym}{mmmm}
  {
   \bool_new:c { g_buergi_sym_ \cs_to_str:N #1 _bool }
   \bool_gset_false:c { g_buergi_sym_ \cs_to_str:N #1 _bool }
   \buergi_defsym:nnnn { #1 } { #2 } { #3 } { #4 }
  }
\cs_new_protected:Npn \buergi_defsym:nnnn #1 #2 #3 #4
 {
  \NewDocumentCommand{#1}{O{#3}}
   {
    \buergi_ifmeasuring:nn
     { #2 }
     {
      \bool_if:cTF  { g_buergi_sym_ \cs_to_str:N #1 _bool }
       { \textcolor{blue}{#2} }
       {
        \textcolor{red}{#2}
        \nomenclature{$#1$}{#4}
        \bool_gset_true:c { g_buergi_sym_ \cs_to_str:N #1 _bool }
       }
     }
   }
 }
\cs_set_eq:Nc \buergi_ifmeasuring:nn { buergi@ifmeasuring }
\ExplSyntaxOff

\defsym\Uk{U_{#1}}{k}{Some variable}
\defsym\Ak{A(#1)}{k}{Another}
\defsym\Bk{B(#1)}{k}{Test}

\makenomenclature

\begin{document}
\noindent $\Uk[j]$, $\Uk$, $\Uk[p]$, $\Uk[q]$ and $\Uk[r]$

\noindent $\Ak$, $\Ak[n]$

\begin{align}
\Bk[j]
\end{align}

\printnomenclature
\end{document}

在此处输入图片描述

相关内容