옵션이 있는 \new명령

옵션이 있는 \new명령

내 질문은 옵션과 함께 "newcommand"를 선언하는 것입니다.

나는 정의했다

\newcommand{\bforall}[2]{\forall #1\, (#2)}

그래서 .$\bforall{x}{x \in A}$$\forall x (x \in A)$

대괄호를 어느 정도 제어하고 싶습니다. 즉, 나는

\bforall[s]{x}{x \in A} 

대괄호를 사용하고

\bforall[c]{x}{x \in A} 

중괄호를 사용합니다.

이것이 어떻게 이루어질 수 있습니까?

포럼을 검색해 보니 1/선택적 인수가 있거나 없는 다양한 명령 정의 그리고 2/newcommand에 대한 선택적 인수? 그리고 둘 다 나에게 도움이 되지 않았습니다.

답변1

패키지가 없는 방법이 있습니다.

\documentclass{article}
\newcommand\bforall[3][r]{%
  \ifx r#1\forall #2\, (#3)\else
  \ifx s#1\forall #2\, [#3]\else
  \ifx c#1\forall #2\, \{#3\}\else
  \mathrm{Illegal~option}%
  \fi\fi\fi
}
\begin{document}
$\bforall{x}{x \in A}$

$\bforall[r]{x}{x \in A}$

$\bforall[s]{x}{x \in A}$

$\bforall[c]{x}{x \in A}$

\end{document}

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

touhami가 올바르게 지적했듯이 \ifx구성의 단순성을 사용하면 발생하는 불이익은 두 문자 선택적 인수를 사용하는 것과 같은 우연한 구문 오류가 [rs]오류 메시지를 생성하지 않고 오히려 용어를 잘못 설정한다는 것입니다.

답변2

다음은xstring패키지 \IfStrEqCase:

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

기본 옵션은 round 중괄호, curly 중괄호 및 square 중괄호입니다. 선택적인 두 번째 매개변수를 추가하여 버팀대 크기를 제어할 수도 있습니다.

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

암호:

\documentclass{article}
\usepackage{xstring}

\newcommand{\bforall}[3][r]{%
    \forall #2\, 
    \IfStrEqCase{#1}{%
        {r}{(#3)}%
        {c}{\{#3\}}%
        {s}{{[#3]}}%
    }[%
        %% Issue error message here about unsuported bracket type
    ]%
}

\begin{document}
$\bforall{x}{x \in A}$

$\bforall[r]{x}{x \in A}$


$\bforall[c]{x}{x \in A}$


$\bforall[s]{x}{x \in A}$

\end{document}

코드 Resizing Brackets:

\documentclass{article}
\usepackage{xstring}
\usepackage{xparse}
\usepackage{amsmath}

\NewDocumentCommand{\bforall}{%
    O{r}% #1 = r, c or s (bracket shape)
    O{}%  #2 = optional size specifier
    m%    #3
    m%    #4
}{%
    \forall #3\, 
    \IfStrEqCase{#1}{%
        {r}{#2(#4#2)}%
        {c}{#2\{#4#2\}}%
        {s}{{#2[#4#2]}}%
    }[%
        %% Issue error message here about unsupported bracket type
        \PackageError{tree}{Undefined option to tree: #1}{}
    ]%
}

\begin{document}
\begin{minipage}{0.25\linewidth}
$\bforall{x}{x \in A}$

$\bforall[r]{x}{x \in A}$

$\bforall[c]{x}{x \in A}$

$\bforall[s]{x}{x \in A}$
\end{minipage}
\hspace*{0.5cm}
\begin{minipage}{0.25\linewidth}
$\bforall[r][\Big]{x}{x \in A, x > \dfrac{1}{2}}$

$\bforall[c][\Big]{x}{x \in A, x > \dfrac{1}{2}}$

$\bforall[s][\bigg]{x}{x \in A, x > \dfrac{1}{2}}$
\end{minipage}
\end{document}

답변3

케이스 전환 매크로의 경우 가장 좋은 것은 다음과 같습니다 expl3. 나는 괄호, 대괄호, 중괄호 amsmath에 이미 공통된 문자를 사용했습니다 .pbB

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\bforall}{O{p}mm}
 {
  \forall #2\,
  \str_case:nnF { #1 }
   {
    {p}{(#3)}
    {b}{[#3]}
    {B}{\{#3\}}
   }
   {\@latex@error{Illegal~option~#1}{I~used~p}}
 }

\ExplSyntaxOff

\begin{document}

$\bforall{x}{x \in A}$

$\bforall[p]{x}{x \in A}$

$\bforall[b]{x}{x \in A}$

$\bforall[B]{x}{x \in A}$

\end{document}

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

답변4

다른 구문을 사용하는 일반 TeX

\def\bforall#1{\forall#1\,\futurelet\tmptoken\dobforall}
\def\dobforall{\ifx\tmptoken\bgroup\expandafter\bforallbraces\fi
               \ifx\tmptoken[\expandafter\bforallbrackets\fi
               \ifx\tmptoken(\expandafter\bforallparenthesis\fi
               \relax}
\def\bforallbraces#1\relax#2{\{#2\}}
\def\bforallbrackets#1\relax[#2]{[#2]}
\def\bforallparenthesis#1\relax(#2){(#2)}

$\bforall{x}(x \in A)$\par
$\bforall{x}{x \in A}$\par
$\bforall{x}[x \in A]$\par

\bye

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

패키지가 없어도 LaTeX에서도 이러한 정의를 사용할 수 있습니다. 저에게는 구문이 더 쉬워 보입니다 \bforall{x}(x\in A). 어쨌든, 귀하의 필요에 따라 해당 매크로가 전혀 필요하지 않을 수도 있습니다. 그러면 입력한 내용이 그대로 따라오게 됩니까?\bforall{x}{x\in A}\bforall{x}[x\in A]\def\bforall#1{\forall#1\,}


구문을 사용할 수 있도록 약간의 개선이 필요합니다 \bforall x {x \in A}. (LaTeX에서는 \@ifnextchar.

\def\bforall#1{\forall#1\,\futurelet\tmptoken\dobforall}
\def\dobforall{\ifx\tmptoken\spacetoken\expandafter\bforallspace\fi
               \ifx\tmptoken\bgroup\expandafter\bforallbraces\fi
               \ifx\tmptoken[\expandafter\bforallbrackets\fi
               \ifx\tmptoken(\expandafter\bforallparenthesis\fi
               \relax}
\def\bforallbraces#1\relax#2{\{#2\}}
\def\bforallbrackets#1\relax[#2]{[#2]}
\def\bforallparenthesis#1\relax(#2){(#2)}
\def\bforallspace#1\relax{\dobforallspace}
\expandafter\def\expandafter\dobforallspace\space{\futurelet\tmptoken\dobforall}
\lowercase{\let\spacetoken= } %

$\bforall x (x \in A)$\par
$\bforall x {x \in A}$\par
$\bforall x [x \in A]$\par

\bye

관련 정보