Как создать команду с необязательными аргументами в LaTeX? Что-то вроде:
\newcommand{\sec}[2][]{
\section*{#1
\ifsecondargument
and #2
\fi}
}
}
Тогда я могу назвать это как
\sec{Hello}
%Output: Hello
\sec{Hello}{Hi}
%Output: Hello and Hi
latex
optional-arguments
Verhogen
источник
источник
Ответы:
Пример из руководства :
источник
Общая идея создания «необязательных аргументов» состоит в том, чтобы сначала определить промежуточную команду, которая просматривает вперед, чтобы определить, какие символы будут следующими в потоке токенов, а затем вставляет соответствующие макросы для обработки аргументов, появляющихся при необходимости. Это может быть довольно утомительно (хотя и несложно) при использовании обычного программирования TeX. LaTeX
\@ifnextchar
очень полезен для таких вещей.Лучший ответ на ваш вопрос - использовать новый
xparse
пакет. Он является частью пакета программирования LaTeX3 и содержит обширные возможности для определения команд с довольно произвольными необязательными аргументами.В вашем примере у вас есть
\sec
макрос, который принимает один или два аргумента в скобках. Это будет реализованоxparse
с помощью следующего:Аргумент
{ m g }
определяет аргументы\sec
;m
означает «обязательный аргумент» иg
является «необязательным аргументом в скобках».\IfNoValue(T)(F)
затем можно использовать, чтобы проверить, действительно ли присутствует второй аргумент. См. Документацию для других типов допустимых аргументов.источник
(Hello and ) (Hello and Hi)
Все вышесказанное показывает, как сложно сделать красивую, гибкую (или запретить перегруженную) функцию в LaTeX !!! (этот код TeX мне кажется греческим)
ну, просто чтобы добавить мою недавнюю (хотя и не такую гибкую) разработку, вот то, что я недавно использовал в своей диссертации, с
Запустите команду с пустым набором «необязательных» команд по умолчанию:
Затем я задаю макросу временную переменную \ temp {} по-разному, в зависимости от того, является ли необязательный аргумент пустым. Это может быть распространено на любой переданный аргумент.
Затем я запускаю макрос, используя переменную \ temp {} для двух случаев. (Здесь он просто устанавливает короткую подпись равной длинной, если она не была указана пользователем).
В этом случае я проверяю только единственный «необязательный» аргумент, который предоставляет \ newcommand {}. Если бы вы настроили его, скажем, для 3 «необязательных» аргументов, вам все равно пришлось бы отправлять 3 пустых аргумента ... например.
что довольно глупо, я знаю, но это все, что я собираюсь сказать о LaTeX - это просто не так разумно, когда я начинаю смотреть на код TeX ... Мне действительно нравится метод xparse мистера Робертсона, возможно, я попробую ...
источник
Все, что вам нужно, это следующее:
источник
x^2+1
илиx^{2+1}
У меня вопрос, проверяет ли ваша команда наличие фигурных скобок? Можно ли создать команду LaTeX,\sec
производящую: «A, b, c и d» для команды\sec{A}[b,c,d]
, «A и b» для\sec{A}[b] and "A" for
\ sec {A} `?\sec{A}[b,c,d]
или\sec{A}[b]
или\sec{A}
.У меня была аналогичная проблема, когда я хотел создать команду
\dx
для сокращения\;\mathrm{d}x
(т.е. поставить дополнительный пробел перед дифференциалом интеграла и также поставить «d» вертикально). Но затем я также хотел сделать его достаточно гибким, чтобы включить переменную интеграции в качестве необязательного аргумента. Я поместил следующий код в преамбулу.затем
дает \ dx с необязательным аргументом
источник
Вот моя попытка, но она не совсем соответствует вашим спецификациям. Не полностью протестирован, поэтому будьте осторожны.
источник