我来找您是因为我想知道如何创建一个与\Alph
或完全相同的新命令\roman
。
我想创建一个编号系统:semel、bis、ter、quater……用于子方程式、子图和子表。
我制作了下面的代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage{etoolbox}
\newcommand*\newnum[1]{
\ifcase#1\unskip
\or semel
\or bis
\or ter
\or quater
\or quinquies
% etc
\fi
}
\patchcmd\subequations
{\def\theequation{\theparentequation\alph{equation}}}
{\def\theequation{\theparentequation\newnum{equation}}}
{}{\FAIL}
\begin{document}
\begin{subequations}
\begin{align}
f(x) &= ax +b +c \\
&= x \left(a + \frac{b}{x} + \frac{c}{x} \right) \\
&= ax + x \left( \frac{b}{x} + \frac{c}{x} \right)
\end{align}
\end{subequations}
\end{document}
但是我收到此错误:
! Missing number, treated as zero.
那么我该如何创建一个有效的命令呢?另一个问题是:如何创建一个这种类型的命令,但它不需要参数?(例如,和都\Alph
存在\Alph{}
)
答案1
用于获取阿拉伯数字形式的 LaTeX 计数器的值。\value{⟨counter⟩}
顺便说一句:我建议从宏的输出中完全删除空格。这样用户可以在需要的地方明确插入空格。
\documentclass{article}
\usepackage{amsmath}
\usepackage{etoolbox}
\makeatletter
\newcommand*\newnum[1]{%
\ifcase\value{#1}%
\or semel%
\or bis%
\or ter%
\or quater%
\or quinquies%
% etc
\else\@ctrerr
\fi
}
\makeatother
% Don't use a space but use a thin space (\,) as Bernard did in his answer:
\patchcmd\subequations
{\def\theequation{\theparentequation\alph{equation}}}
{\def\theequation{\theparentequation\ifnum\value{equation}<1 \else\protect\,\fi\newnum{equation}}}
{}{\FAIL}
\begin{document}
\begin{subequations}
\begin{align}
f(x) &= ax +b +c \\
&= x \left(a + \frac{b}{x} + \frac{c}{x} \right) \\
&= ax + x \left( \frac{b}{x} + \frac{c}{x} \right)
\end{align}
\end{subequations}
\end{document}
顺便说一下:你的第二个问题
另一个问题:如何创建这种类型的命令,但不需要参数?(例如,和都
\Alph
存在\Alph{}
)
我不清楚:
\documentclass{article}
\begin{document}
\show\Alph
\end{document}
揭示了:
> \Alph=macro:
#1->\expandafter \@Alph \csname c@#1\endcsname .
l.3 \show\Alph
这意味着它\Alph
是一个宏,在任何情况下,它在扩展过程中都会处理非分隔的参数。
该非分隔参数必须是 LaTeX 计数器的名称。
该参数被包装到其中。\expandafter\@Alph\csname c@⟨counter⟩\endcsname
确保在应用于控制字标记之前,\expandafter
控制字标记由..构造形成。控制字标记表示 TeX-寄存器,它是相关 LaTeX 计数器的基础。\c@counter
\csname
\endcsname
\@Alph
\c@counter
\count
因此,\Alph
包装器的\@Alph
作用是形成某种东西(表示寄存器的控制字标记\count
),可以作为 TeX-⟨数字⟩-来自 LaTeX 计数器名称的数量。
\@Alph
依次处理必须是 TeX- 的参数⟨数字⟩-数量。
TeX-⟨数字⟩-quantity 反过来可以是一个控制字标记,表示\count
根据 分配的寄存器\countdef
。
但这还不是全部。TeX-⟨数字⟩-quantity 可以是一个字母常量,或者类似的东西,`\a
或者是一个数字序列。
(有关 TeX 语法规则的更多详细信息,请参阅⟨数字⟩-数量可以在 TeXBook 第 24 章:垂直模式摘要中找到。)
当然你也可以像这样\newnum
实现\@newnum
:
\documentclass{article}
\makeatletter
\newcommand*\@newnum[1]{%
\ifcase#1%
\or semel%
\or bis%
\or ter%
\or quater%
\or quinquies%
% etc
\else\@ctrerr
\fi
}%
\newcommand*\newnum[1]{%
\expandafter\@newnum\csname c@#1\endcsname
}%
\makeatother
\newcounter{testcounter}
\begin{document}
Testing \verb|\newnum| (argument must denote a \LaTeX-counter):
\medskip
\setcounter{testcounter}{1}
\newnum{testcounter}
\setcounter{testcounter}{2}
\newnum{testcounter}
\setcounter{testcounter}{3}
\newnum{testcounter}
\setcounter{testcounter}{4}
\newnum{testcounter}
\bigskip
Testing \verb|\@newnum| (argument must denote a \TeX-number-quantity):
\medskip
\makeatletter
\@newnum{1}%
\@tempcnta=2
\@newnum{\@tempcnta}%
\setcounter{testcounter}{3}
\@newnum{\value{testcounter}}%
\@newnum{`\^^D}
\makeatother
\end{document}
答案2
我无法修补它,但这里有一个重新定义环境(或定义您自己的子方程环境)的代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage{etoolbox}
\makeatletter%
\def\newnum#1{\expandafter\@newnum\csname c@#1\endcsname}
\def\@newnum#1{%
\ifcase#1\or semel\or bis\or ter\or quater\or quinquies\or sexies\or septies\or octies\or nonies\else\@ctrerr\fi}
\renewenvironment{subequations}{%
\refstepcounter{equation}%
\protected@edef\theparentequation{\theequation}%
\setcounter{parentequation}{\value{equation}}%
\setcounter{equation}{0}%
\def\theequation{\theparentequation\,\newnum{equation}}%
\ignorespaces
}{%
\setcounter{equation}{\value{parentequation}}%
\ignorespacesafterend
}
\makeatother
\begin{document}
\setcounter{equation}{3}
\begin{equation}\label{eq}
a = b
\end{equation}
\begin{subequations}
\begin{align}
f(x) &= ax +b +c \\
&= x \left(a + \frac{b}{x} + \frac{c}{x} \right) \\
&= ax + x \left( \frac{b}{x} + \frac{c}{x} \right)
\end{align}
\end{subequations}
\end{document}