Estou vindo até você porque gostaria de saber como criar um novo comando que funcionasse exatamente como \Alph
ou \roman
.
Gostaria de criar um sistema de numeração: semel, bis, ter, quater, . . . que eu usaria para subequações, subfiguras e subtabelas.
Produzi o código abaixo:
\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}
Mas eu recebo este erro:
! Missing number, treated as zero.
Então, como faço para criar um comando funcional? Outra dúvida: como criar um comando desse tipo, mas que não precisa de argumento? (Por exemplo, ambos \Alph
e \Alph{}
existem)
Responder1
Use para obter o valor de um contador LaTeX em termos de algarismos arábicos.\value{⟨counter⟩}
A propósito: sugiro remover completamente os espaços da saída da macro. Assim, o usuário pode inseri-los explicitamente onde desejar.
\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}
A propósito: sua segunda pergunta
Outra dúvida: como criar um comando desse tipo, mas que não precisa de argumento? (Por exemplo, ambos
\Alph
e\Alph{}
existem)
não está claro para mim:
\documentclass{article}
\begin{document}
\show\Alph
\end{document}
revela:
> \Alph=macro:
#1->\expandafter \@Alph \csname c@#1\endcsname .
l.3 \show\Alph
Isto significa \Alph
que é uma macro que em qualquer caso durante a sua expansão processa um argumento não delimitado.
Esse argumento não delimitado deve ser o nome de um contador LaTeX.
Esse argumento é envolvido em .\expandafter\@Alph\csname c@⟨counter⟩\endcsname
Isso \expandafter
garante que o token da palavra de controle seja formado a partir da construção .. antes de ser aplicado a esse token da palavra de controle. O token da palavra de controle denota o registro TeX que está subjacente ao contador LaTeX em questão.\c@counter
\csname
\endcsname
\@Alph
\c@counter
\count
O mesmo \Alph
ocorre com um wrapper \@Alph
que serve ao propósito de formar algo (um token de palavra de controle denotando um \count
-registro) que pode ser processado como um TeX-⟨número⟩-quantidade do nome de um contador LaTeX.
\@Alph
por sua vez, processa um argumento que deve ser um TeX-⟨número⟩-quantidade.
Um TeX-⟨número⟩-quantidade, por sua vez, pode, por exemplo, ser um token de palavra de controle denotando um \count
-registro alocado em termos de \countdef
.
Mas isso não é tudo. Um TeX-⟨número⟩-quantidade pode, por exemplo, ser uma constante alfabética, algo parecido `\a
ou uma sequência de dígitos.
(Mais detalhes sobre as regras de sintaxe para TeX-⟨número⟩-quantidades podem ser encontradas no TeXBook, Capítulo 24: Resumo do Modo Vertical.)
Claro que você também pode implementar \newnum
/ \@newnum
assim:
\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}
Responder2
Não consegui corrigir, mas aqui está um código para redefinir o ambiente (ou definir seu próprio ambiente de subequações):
\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}