数学符号/变量的逻辑标记,替代 \newcommand

数学符号/变量的逻辑标记,替代 \newcommand

我想使用标记来标记任何数学符号/变量(抱歉,我不确定这里的正确术语是什么)。这样做的原因是只需在一个地方进行调整,就可以更轻松地对命名约定进行后期更改。以下最小示例显示了我想要做的事情,以及使用 \newcommand 的限制,因为它不允许在宏名称中使用数字。如果注释行被编译,则会引发错误,但是需要使用数字来描述某些变量,因为会有多个变量,只是数字不同。

\documentclass{scrbook}
\begin{document}
\newcommand{\asteer}{a_{steer}}
\newcommand{\awheelfl}{a_{Wheel,FL}}
\newcommand{\awheelfr}{a_{Wheel,FR}}
%\newcommand{\rthrottle5}{r_{Throttle,q5}}
\begin{equation}
    a_{Steer} = a_{Wheel,FL} - a_{Wheel,FR}
\end{equation}
\begin{equation}
    \asteer = \awheelfl - \awheelfr
\end{equation}
\end{document}

我在这里找到了一个解决方案:https://texfaq.org/FAQ-linmacnames(#2),但是我想知道是否有更好的解决方案。也许根本不需要使用 \newcommand。

欢呼吧,卢卡斯

答案1

我会使用词汇表。这给你建立符号列表带来额外的好处。

\documentclass{scrbook}
\usepackage{glossaries}
\newglossaryentry{asteer}
{%
  name={$a_{\mathrm{steer}}$},
  text={a_{\mathrm{steer}}},
  description={whatever},
  sort={a}
}

\newglossaryentry{awheelfl}
{%
  name={$a_{\mathrm{Wheel,FL}}$},
  text={a_{\mathrm{Wheel,FL}}},
  description={whatever},
  sort={a}
}
\begin{document}
\begin{equation}
    \gls{asteer} = \gls{awheelfl}
\end{equation}

\end{document}

在此处输入图片描述

答案2

\documentclass{article}

\makeatletter
\newcommand\newname[1]{\expandafter\newcommand\csname #1\endcsname}

\newcommand\usename[1]{\@nameuse{#1}}
\makeatother

\begin{document}

\newname{a1}{this is a1}

\usename{a1}

% \newname{a1}{this is a1}% LaTeX Error: Command \a1 already defined.

\newname{a2}[3]{this is a2, it gets arguments #1, #2, #3}

\usename{a2}{aa}{bbb}{cccc}

\end{document}

在此处输入图片描述


我现在意识到这与发布的链接非常接近#2。但它更好,因为它允许定义星型变量,以及带有可选参数的宏。


更新

\documentclass{article}

\makeatletter
\newcommand\newname[1]{\expandafter\newcommand\csname #1\endcsname}

\newcommand\usename[1]{\@nameuse{#1}}

\newcommand\ZZZ{}% check not defined
\def\ZZZ#1#{\@nameuse{ZZZ#1}}

\makeatother

\begin{document}

\newname{a1}{this is a1}

\usename{a1}

% \newname{a1}{this is a1}% LaTeX Error: Command \a1 already defined.

\newname{a2}[3]{this is a2, it gets arguments #1, #2, #3}

\usename{a2}{aa}{bbb}{cccc}

\newname{ZZZ1}{this is ZZZ1, it has no arguments, braces mandatory}
\newname{ZZZ2}{this is ZZZ2, it has no arguments, braces mandatory}
\newname{ZZZ---999}[2]{this is ZZZ-\mbox{}-\mbox{}-999 with arguments #1 and #2}


\ZZZ1{}

\ZZZ2{}

\ZZZ---999{aaaa}{bbbb}

\end{document}

在此处输入图片描述

答案3

在我对“定义一个控制序列之后,空格很重要”这个问题的回答中我详细说明了一个宏\name,其用法如下:

\name <tokens without braces>{<name of Control Sequence Token>}
<tokens without braces>\ControlSequenceToken

您可以使用\name-macro 来定义和调用宏。


以下是具体实现:

\newcommand\name{}%
\long\def\name#1#{\romannumeral0\innername{#1}}%
%
\newcommand\innername[2]{%
  \expandafter\exchange\expandafter{\csname#2\endcsname}{ #1}%
}%
%
\newcommand\exchange[2]{#2#1}%

\name这是使用的方式定义宏:

示例 1:

\name\newcommand{rthrottle5}产量:
\newcommand\rthrottle5,因此你可以,例如,做:

\name\newcommand{rthrottle5}{r_{Throttle,q5}}
\newcommand\rthrottle5{r_{Throttle,q5}}

示例 2:

\name\global\long\def{foo}产量:
\global\long\def\foo,因此你可以,例如,做:

\name\global\long\def{foo}#1#2{foo's arg1: #1; foo's arg2: #2.}\global\long\def\foo#1#2{foo's arg1: #1; foo's arg2: #2.}


示例 3:

\name这是使用的方式呼叫宏:只需将<tokens without braces>-argument 留空:

\name{rthrottle5}
\rthrottle5


-argument<tokens without braces>还可以由 -macro 的一些调用序列组成name

示例 4:

\name\name\let{foo}={bar}
\name\let\foo={bar}
\let\foo=\bar

示例 5:

\name\name\name\futurelet{foo}{bar}{baz}
\name\name\futurelet\foo{bar}{baz}
\name\futurelet\foo\bar{baz}
\futurelet\foo\bar\baz


\name在您的示例中使用-macro:

\documentclass{scrbook}

\newcommand\name{}%
\long\def\name#1#{\romannumeral0\innername{#1}}%
\newcommand\innername[2]{%
  \expandafter\exchange\expandafter{\csname#2\endcsname}{ #1}%
}%
\newcommand\exchange[2]{#2#1}%

\begin{document}
\name\newcommand{asteer}{a_{Steer}}
\name\newcommand{awheelfl}{a_{Wheel,FL}}
\name\newcommand{awheelfr}{a_{Wheel,FR}}
\name\newcommand{rthrottle5}{r_{Throttle,q5}}
\begin{equation}
    a_{Steer} + r_{Throttle,q5} = a_{Wheel,FL} - a_{Wheel,FR} + r_{Throttle,q5}
\end{equation}
\begin{equation}
    \name{asteer} + \name{rthrottle5} = \name{awheelfl} - \name{awheelfr} + \name{rthrottle5}
\end{equation}

Or. if you like:

\begin{equation}
    \name\name\name\name\name%
    {asteer} + {rthrottle5} = {awheelfl} - {awheelfr} + {rthrottle5}
\end{equation}

\end{document}

在此处输入图片描述

相关内容