새로운 번호 시스템

새로운 번호 시스템

\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} 

여기에 이미지 설명을 입력하세요

관련 정보