유사한 구조의 매크로

유사한 구조의 매크로

현재 매크로를 사용하고 있는데,

\def\<#1: #2: #3\>{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}

출처:http://ctan.org/pkg/tex-ewd.

그리고 또 다른 유사한 매크로를 만들고 싶습니다.

\def\<#1 if #2 else #3\>{ \langle #1\; \lhd #2\; \rhd \;#3\rangle }

그러나 후자는 전자와 충돌한다. 둘 중 하나만 가질 수 있는 것 같습니다. 이 문제에 대한 도움을 주시면 대단히 감사하겠습니다!

감사합니다!

추신. 저는 여러 deletmiter나 그러한 구조를 가진 매크로에 대해 잘 모릅니다. 이에 대해 더 자세히 알아보는 데 도움이나 방향이 있으면 언제든지 환영합니다!

답변1

당신은 불명예를 찾고 있습니다. 매크로가 해야 할 일하나직업. 그러나 여기에 있습니다. ConTeXt에서는 의 사용을 \numexpr허용해야 하지만 아마도 와 를 사용하기 위해 글꼴을 설정할 필요는 없을 것입니다 \lhd.\rhd

\def\<#1\>{\moseslookforif#1if\moseslookforif}
\def\moseslookforif#1if#2\moseslookforif{%
  \ifx\hfuzz#2\hfuzz
    % no if in the argument
    \mosescolon#1\mosescolon
  \else
    \mosesifelse#1if#2\mosesifelse
  \fi
}

\def\mosescolon#1: #2: #3\mosescolon{%
  \langle #1:\ifx\hfuzz#2\hfuzz\else#2\fi:#3\rangle
}
\def\mosesifelse#1 if #2 else #3if\mosesifelse{%
  \langle #1 \lhd #2 \rhd #3\rangle
}

%%% Code possibly to be omitted, if \lhd and \rhd are already available    
\font\tenlasy=lasy10
\font\sevenlasy=lasy7
\font\fivelasy=lasy5
\newfam\lasyfam
\textfont\lasyfam=\tenlasy
\scriptfont\lasyfam=\sevenlasy
\scriptscriptfont\lasyfam=\fivelasy
\mathchardef\lhd=\numexpr2*"1000+\lasyfam*"100+"01\relax
\mathchardef\rhd=\numexpr2*"1000+\lasyfam*"100+"03\relax
%%% end of code to possibly omit

% the example

$\<a : b : c\>$

$\<x if y else z\>$

\bye

참고로 테스트 \if#2\empty잘못된. yy예를 들어 매크로에 대한 두 번째 인수가 물론 원하지 않는 경우 true를 반환합니다 .

\;원래 매크로에 추가된 공백을 제거했습니다 .

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

답변2

귀하는 귀하가 초보자임을 인정하므로 귀하가 제안한 내용에 대한 분석부터 시작하겠습니다. 네가 말할 때

\def\<#1: #2: #3\>{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}

라는 매크로를 정의합니다 \<. 이는 매크로를 호출하려면 .tex 파일에 이 토큰이 포함되어야 함을 의미합니다. 또한 정의한 구문에 따르면 .tex 입력은 다음(매우 제한적인 구문)을 사용하여 매크로를 호출해야 합니다 \<FIRSTARG:SPACE SECONDARG:SPACE THIRDARG\>. 공백을 생략하면 오류와 함께 컴파일이 실패합니다. 인수 자체에 공백이나 콜론이 포함되어 있으면 마찬가지로 오류가 발생할 수 있습니다(또는 목록에서 잘못 배치된 인수 정의).

그래서 당신이 동안~할 수 있다이런 식으로 매크로를 정의하면 사용하기 편리하지 않은 것 같습니다. 아마도 당신은산출타이핑을 요구하기보다는 특정 방식으로 보이도록입력특정 방식으로 나타납니다. 3개 인수 입력에 대해 LaTex에서 이러한 매크로를 정의하는 일반적인 방법은 입니다 \newcommand\macroname[3]{...macros to produce the desired output using inputs #1, #2, and #3...}. 호출 형식은 다음과 같습니다 \macroname{FIRSTARG}{SECONDARG}{THIRDARG}. 이러한 방식으로 중괄호는 이제 모호함 없이 콜론과 공백을 포함할 수 있는 입력을 구분합니다.

따라서 을 정의하면 \newcommand\colonangle[3]{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}구문을 사용하여 원하는 첫 번째 매크로 출력을 얻을 수 있습니다(예: ) \colonangle{x}{y}{z}.

이제 두 번째 예를 살펴보겠습니다. 또한 명명된 매크로 \<(이전 매크로 이름과 중복되지만 이제 다른 입력 구문이 필요함)를 생성할 뿐만 아니라 다음 if과 같은 단어를 사용해야 합니다.else입력파일. 대신, 혼란을 피하기 위해 보다 표준적인 입력 구문을 사용하는 두 번째 매크로 정의를 제안합니다.

\documentclass{article}
\usepackage{amssymb}
\newcommand\colonangle[3]{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
\newcommand\arrowangle[3]{ \langle #1\; \lhd #2\; \rhd \;#3\rangle }
\begin{document}
$\colonangle{A}{B}{C} \ne \arrowangle{A}{B}{C}$
\end{document}

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

관련 정보