
Ich verwende derzeit das Makro,
\def\<#1: #2: #3\>{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
Genommen von:http://ctan.org/pkg/tex-ewd.
Und ich möchte ein weiteres ähnliches Makro erstellen,
\def\<#1 if #2 else #3\>{ \langle #1\; \lhd #2\; \rhd \;#3\rangle }
Aber letzteres steht im Widerspruch zu ersterem. Es scheint, ich kann nur das eine oder das andere haben. Für jede Hilfe in dieser Angelegenheit wäre ich sehr dankbar!
Danke schön!
PS. Ich weiß nicht viel über mehrere Deletmiter oder Makros mit einer solchen Struktur. Jede Hilfe oder Anleitung, um mehr darüber zu erfahren, wäre sehr willkommen!
Antwort1
Du suchst nach Schande. Ein Makro sollte genügeneinsJob. Hier ist es jedoch. Die Verwendung von \numexpr
sollte mit ConTeXt erlaubt sein, aber wahrscheinlich besteht keine Notwendigkeit, Schriftarten für die Verwendung von \lhd
und einzurichten\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
Beachten Sie, dass der \if#2\empty
Testfalsch. Es wird true zurückgegeben, wenn das zweite Argument des Makros yy
beispielsweise lautet, was natürlich nicht erwünscht ist.
Ich habe die überflüssigen Leerzeichen entfernt, die \;
im ursprünglichen Makro entstanden sind.
Antwort2
Sie geben zu, dass Sie ein Anfänger sind, also beginnen wir mit einer Analyse Ihres Vorschlags. Wenn Sie sagen
\def\<#1: #2: #3\>{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
Sie definieren ein Makro mit dem Namen \<
, was bedeutet, dass Ihre .tex-Datei dieses Token enthalten muss, um das Makro aufzurufen. Darüber hinaus besagt die von Ihnen definierte Syntax, dass Ihre .tex-Eingabe das Makro mit der folgenden (sehr restriktiven Syntax) aufrufen muss: \<FIRSTARG:SPACE SECONDARG:SPACE THIRDARG\>
. Wenn Sie die Leerzeichen weglassen, schlägt die Kompilierung mit einem Fehler fehl. Wenn eines der Argumente selbst ein Leerzeichen oder einen Doppelpunkt enthält, kann dies ebenfalls zu Fehlern führen (oder zumindest zu falsch platzierten Argumentdefinitionen).
Während Sie alsodürfenWenn Sie ein Makro auf diese Weise definieren, scheint es nicht bequem zu verwenden. Wahrscheinlicher ist, dass Sie dasAusgabeauf eine bestimmte Weise aussehen, anstatt die eingegebeneEingangauf eine bestimmte Weise erscheinen. Die normale Art, ein solches Makro (in LaTex) für eine 3-Argument-Eingabe zu definieren, wäre \newcommand\macroname[3]{...macros to produce the desired output using inputs #1, #2, and #3...}
. Die Aufrufform ist dann \macroname{FIRSTARG}{SECONDARG}{THIRDARG}
. Auf diese Weise begrenzen Klammern die Eingaben, die nun ohne Mehrdeutigkeit Doppelpunkte und Leerzeichen enthalten können.
Wenn ich also definiert hätte \newcommand\colonangle[3]{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
, könnte ich die gewünschte erste Makroausgabe beispielsweise mit der Syntax erhalten \colonangle{x}{y}{z}
.
Nun zu Ihrem zweiten Beispiel. Es erstellt nicht nur ein Makro mit dem Namen \<
(das ein Duplikat des vorherigen Makronamens ist, aber jetzt eine andere Eingabesyntax erfordert), sondern erfordert auch die Verwendung von Wörtern wie if
und else
in derEingangDatei. Stattdessen schlage ich eine zweite Makrodefinition vor, um Verwirrung zu vermeiden, indem ich eine standardisiertere Eingabesyntax verwende.
\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}