![数学符号/变量的逻辑标记,替代 \newcommand](https://linux22.com/image/385035/%E6%95%B0%E5%AD%A6%E7%AC%A6%E5%8F%B7%2F%E5%8F%98%E9%87%8F%E7%9A%84%E9%80%BB%E8%BE%91%E6%A0%87%E8%AE%B0%EF%BC%8C%E6%9B%BF%E4%BB%A3%20%5Cnewcommand.png)
我想使用标记来标记任何数学符号/变量(抱歉,我不确定这里的正确术语是什么)。这样做的原因是只需在一个地方进行调整,就可以更轻松地对命名约定进行后期更改。以下最小示例显示了我想要做的事情,以及使用 \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}