Macros Estruturadas Semelhantes

Macros Estruturadas Semelhantes

Atualmente estou usando a macro,

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

Tirado de:http://ctan.org/pkg/tex-ewd.

E eu gostaria de fazer outra macro semelhante,

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

Mas este último entra em conflito com o anterior. Parece que só posso ter um ou outro. Qualquer ajuda sobre este assunto seria muito apreciada!

Obrigado!

PS. Não sei muito sobre múltiplos deletmiters ou macros com tal estrutura. Qualquer ajuda ou orientação para aprender mais sobre isso seria muito bem-vinda!

Responder1

Você está procurando por desgraça. Uma macro deve fazerumtrabalho. No entanto, aqui está. O uso de \numexprdeve ser permitido com o ConTeXt, mas provavelmente não há necessidade de configurar fontes para uso \lhde\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

Observe que o teste \if#2\emptyéerrado. Ele retornará verdadeiro se o segundo argumento da macro for yy, por exemplo, o que obviamente não é desejado.

Removi os espaços em excesso introduzidos \;na macro original.

insira a descrição da imagem aqui

Responder2

Você admite que é iniciante, então começaremos com uma análise do que você propôs. Quando voce diz

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

você está definindo uma macro chamada \<, o que significa que seu arquivo .tex deve conter esse token para invocar a macro. Além disso, a sintaxe que você definiu diz que sua entrada .tex deve invocar a macro com o seguinte (sintaxe muito restritiva): \<FIRSTARG:SPACE SECONDARG:SPACE THIRDARG\>. Se você omitir os espaços, a compilação falhará com um erro. Se algum dos argumentos contiver um espaço ou dois pontos, isso também poderá produzir erros (ou, na lista, definições de argumentos mal colocadas).

Então enquanto vocêpodedefinir uma macro desta forma, não parece conveniente para uso. Mais provavelmente, você quer osaídater uma determinada aparência, em vez de exigir o digitadoentradaaparecer de uma certa maneira. A maneira normal de definir tal macro (em LaTex) para uma entrada de 3 argumentos seria \newcommand\macroname[3]{...macros to produce the desired output using inputs #1, #2, and #3...}. O formulário de invocação é então \macroname{FIRSTARG}{SECONDARG}{THIRDARG}. Desta forma, os colchetes delimitam as entradas, que agora podem conter dois pontos e espaços sem ambiguidade,

Portanto, se eu definisse \newcommand\colonangle[3]{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}, poderia obter a primeira saída de macro desejada com a sintaxe, por exemplo \colonangle{x}{y}{z},.

Agora, para o seu segundo exemplo. Ele não apenas cria uma macro chamada \<(que é uma duplicata do nome da macro anterior, mas agora requer uma sintaxe de entrada diferente), mas também exige que você use palavras como ife elsenoentradaarquivo. Em vez disso, proponho uma segunda definição de macro, para evitar confusão, usando uma sintaxe de entrada mais padrão.

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

insira a descrição da imagem aqui

informação relacionada