在 \mathchoice 中使用 \setlength

在 \mathchoice 中使用 \setlength

我编写了一些比较复杂的tikz宏,它们使用长度来设置比例。我意识到我希望它们在显示数学和内联数学模式中使用时具有不同的比例,我认为我可以使用\mathchoice和来实现这一点\setlength。但是,我似乎无法让它工作,我不确定为什么。

以下是演示此问题的 MWE:

\documentclass{article}

\newlength{\mylength}
\setlength{\mylength}{0.4em}

\newcommand{\autoscale} {%
    \mathchoice%
        {\setlength{\mylength}{0.4em}}%
        {\setlength{\mylength}{0.2em}}%
        {\setlength{\mylength}{0.2em}}%
        {\setlength{\mylength}{0.2em}}%
}

\newcommand{\mycirc}{%
    \autoscale
    \begin{tikzpicture}
        \draw (0,0) circle (\mylength);
    \end{tikzpicture}%
}

\usepackage{tikz}

\begin{document}

A circle in a display equation:
\[
    x = \mycirc
\]

An inline one, which should be half the size: $y = \mycirc$.

\end{document}

输出如下所示: 在此处输入图片描述

通过尝试此代码的变体,它似乎\mathchoice按我预期的方式工作(在显示模式下调用时运行其第一个参数,在内联数学模式下运行其第二个参数)。如果我将命令\setlength直接插入方程式中,它也会按预期工作。所以它似乎是某种组合,\setlength\mathchoice导致了问题。

当然,我愿意接受其他方式,\mylength根据我们处于内联模式还是显示数学模式来使其具有不同的值。

答案1

在里面分配长度有两个问题\mathchoice

  • 在内部进行的分配\mathchoice仅在其范围内有效,\mathchoice除非它们是\global

  • \mathchoice实际上排版/运行了所有四个参数;哪一个应该显示在文档中只能稍后确定。(尝试在 a 的所有四个参数中增加一个计数器\mathchoice,你会感到惊讶!)

因此,您不能使用\mathchoice来使变量依赖于您所在的方程类型。如果您想使用 来\mathchoice检测您的符号是否在 中使用\displaystyle\textstyle你应该将绘图命令放在它的四个参数中的每一个中(例如参见答案这个问题了解该命令的详细描述)。 您可能还想看看\mathpalette,这通常更方便。


选择

如果你使用amsmath(您可能已经处于这种情况),您可以使用条件\if@display来测试您是处于显示方程还是内联方程。由于此命令包含@,因此您需要使用\makeatletter

但请注意,如果您处于显示方程中的下标/上标中,这仍然会告诉您您处于该方程中。

它的工作原理如下:

\documentclass{article}

\newlength{\mylength}
\setlength{\mylength}{0.4em}

\usepackage{amsmath}

\makeatletter %% <- make @ usable in command sequences
\newcommand{\autoscale}{%
    \if@display
        \setlength{\mylength}{0.4em}%
    \else
        \setlength{\mylength}{0.2em}%
    \fi
}
\makeatother %% <- revert @

\newcommand{\mycirc}{%
    \autoscale
    \begin{tikzpicture}
        \draw (0,0) circle (\mylength);
    \end{tikzpicture}%
}

\usepackage{tikz}

\begin{document}

A circle in a display equation:
\[
    x = \mycirc
\]

An inline one, which should be half the size: $y = \mycirc$.

\end{document}

输出

答案2

你不能这样做,每个选择都是一个组,并且所有四个组总是以相同的顺序进行评估,因此在 TeX 内部执行与

        \hbox{\setlength{\mylength}{0.4em}}%
        \hbox{\setlength{\mylength}{0.2em}}%
        \hbox{\setlength{\mylength}{0.2em}}%
        \hbox{\setlength{\mylength}{0.2em}}%

所以即使你做了全局分配,你也总是会得到相同的结果。使用哪个框的选择是在从数学列表到水平列表的映射中,但无法从 TeX 代码访问。

相关内容