\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
제어 단어 토큰이 .. -구조 에서 형성되도록 보장 합니다. 제어 단어 토큰은 문제의 LaTeX 카운터의 기초가 되는 TeX- 레지스터를 나타냅니다 .\c@counter
\csname
\endcsname
\@Alph
\c@counter
\count
TeX-로 처리될 수 있는 무언가(-레지스터를 나타내는 제어 단어 토큰)를 형성하는 목적을 제공하는 \Alph
래퍼도 마찬가지 입니다.\@Alph
\count
⟨숫자⟩-LaTeX 카운터 이름의 수량.
\@Alph
차례로 TeX-이어야 하는 인수를 처리합니다.⟨숫자⟩-수량.
A TeX-⟨숫자⟩\count
-양은 예를 들어 의 관점에서 할당된 -레지스터를 나타내는 제어 단어 토큰일 수 있습니다 \countdef
.
하지만 그게 전부는 아닙니다. A 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}