Я обращаюсь к вам, потому что хочу узнать, как создать новую команду, которая работала бы точно так же, как \Alph
или \roman
.
Я хотел бы создать систему нумерации: семел, бис, тер, кватер, ..., которую я бы использовал для подуравнений, подрисунков и подтаблиц.
Я создал следующий код:
\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
, что control-word-token формируется из .. -конструкции перед применением к control-word-token. Control-word-token обозначает TeX- -регистр, который лежит в основе рассматриваемого LaTeX-счетчика.\c@counter
\csname
\endcsname
\@Alph
\c@counter
\count
Так же \Alph
есть оболочка, \@Alph
которая служит для формирования чего-то (токена-управляющего-слова, обозначающего -регистр \count
), что может быть обработано как TeX-⟨число⟩-количество из названия LaTeX-счетчика.
\@Alph
в свою очередь обрабатывает аргумент, который должен быть TeX-⟨число⟩-количество.
A TeX-⟨число⟩-quantity в свою очередь может быть, например, контрольным словом-токеном, обозначающим \count
-регистр, выделенный в терминах \countdef
.
Но это еще не все. TeX-⟨число⟩-количество может быть, например, буквенной константой, чем-то вроде `\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}