
Actualmente estoy usando la macro,
\def\<#1: #2: #3\>{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
Tomado de:http://ctan.org/pkg/tex-ewd.
Y me gustaría hacer otra macro similar,
\def\<#1 if #2 else #3\>{ \langle #1\; \lhd #2\; \rhd \;#3\rangle }
Pero este último choca con el primero. Parece que sólo puedo tener uno u otro. ¡Cualquier ayuda en este asunto sería muy apreciada!
¡Gracias!
PD. No sé mucho sobre múltiples eliminadores o macros con esa estructura. ¡Cualquier ayuda o dirección para aprender más sobre esto será bienvenida!
Respuesta1
Estás buscando la desgracia. Una macro debería servirunotrabajo. Sin embargo, aquí está. El uso de \numexpr
debería permitirse con ConTeXt, pero probablemente no sea necesario configurar fuentes para usar \lhd
y\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
Tenga en cuenta que la prueba \if#2\empty
esequivocado. Devolverá verdadero si el segundo argumento de la macro es yy
, por ejemplo, lo que por supuesto no es deseado.
Eliminé los espacios sobrantes introducidos \;
en la macro original.
Respuesta2
Reconoces que eres principiante, así que empezaremos con un análisis de lo que has propuesto. Cuando tu dices
\def\<#1: #2: #3\>{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
está definiendo una macro llamada \<
, lo que significa que su archivo .tex debe contener este token para poder invocar la macro. Además, la sintaxis que ha definido dice que su entrada .tex debe invocar la macro con la siguiente (sintaxis muy restrictiva): \<FIRSTARG:SPACE SECONDARG:SPACE THIRDARG\>
. Si omite los espacios, la compilación fallará y se producirá un error. Si alguno de los argumentos contiene un espacio o dos puntos, eso también podría producir errores (o al menos definiciones de argumentos fuera de lugar).
Así que mientras tupoderDefina una macro de esta manera, no parece conveniente para su uso. Lo más probable es que quieras elproducciónverse de cierta manera, en lugar de requerir el mecanografiadoaporteaparecer de cierta manera. La forma normal de definir dicha macro (en LaTex) para una entrada de 3 argumentos sería \newcommand\macroname[3]{...macros to produce the desired output using inputs #1, #2, and #3...}
. La forma de invocación es entonces \macroname{FIRSTARG}{SECONDARG}{THIRDARG}
. De esta manera, las llaves delimitan las entradas, que ahora pueden contener dos puntos y espacios sin ambigüedad,
Entonces, si definiera \newcommand\colonangle[3]{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
, podría obtener la primera salida macro deseada con la sintaxis, por ejemplo, \colonangle{x}{y}{z}
.
Ahora a su segundo ejemplo. No solo crea una macro llamada \<
(que es un duplicado del nombre de la macro anterior, pero que ahora requiere una sintaxis de entrada diferente), sino que requiere que uses palabras como if
y else
en elaportearchivo. En su lugar, propongo una segunda definición de macro, para evitar confusiones, utilizando una sintaxis de entrada más estándar.
\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}