
В настоящее время я использую макрос,
\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 }
Но этот последний конфликтует с первым. Похоже, я могу иметь только один или другой. Любая помощь по этому вопросу была бы очень признательна!
Спасибо!
PS. Я не знаю много о множественных deletmiters или макросах с такой структурой. Любая помощь или направление к изучению этого вопроса будут очень приветствоваться!
решение1
Вы ищете позор. Макрос должен сделатьодинработа. Однако, вот оно. Использование \numexpr
должно быть разрешено с ConTeXt, но, вероятно, нет необходимости настраивать шрифты для использования \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
Обратите внимание , что тестнеправильный. Он вернет true, если второй аргумент макроса — yy
, например, что, конечно, нежелательно.
Я удалил лишние пробелы, введенные \;
в исходном макросе.
решение2
Вы признаете, что вы новичок, поэтому начнем с анализа того, что вы предложили. Когда вы говорите
\def\<#1: #2: #3\>{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
вы определяете макрос с именем \<
, что означает, что ваш файл .tex должен содержать этот токен для вызова макроса. Кроме того, определенный вами синтаксис говорит, что ваш ввод .tex должен вызывать макрос следующим образом (очень ограничительный синтаксис): \<FIRSTARG:SPACE SECONDARG:SPACE THIRDARG\>
. Если вы пропустите пробелы, компиляция завершится ошибкой. Если какой-либо из аргументов сам по себе содержит пробел или двоеточие, то это также может привести к ошибкам (или, по крайней мере, к неуместным определениям аргументов).
Так что пока выможетопределить макрос таким образом, это кажется не удобным для использования. Скорее всего, вы хотите, чтобывыходвыглядеть определенным образом, а не требовать напечатанноговходвыглядеть определенным образом. Обычный способ определения такого макроса (в LaTex) для ввода с 3 аргументами будет \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}