У меня есть следующее определение команды (это запись списка записей), которое работает нормально:
\newcommand{\entry}[4]{%
#1&\parbox[t]{11.2cm}{%
#2%
\hfill%
#3%
\\#4%
}\\}
Теперь у меня есть тестовый случай, когда 4-й параметр может быть пустым. В этом случае я не хочу отображать новую строку, определенную перед ним. Я попробовал следующий подход:
\newcommand{\entry}[4]{%
#1&\parbox[t]{11.2cm}{%
#2%
\hfill%
#3%
\ifthenelse{\isempty{#4}}{}{\\#4}%
}\\}
но он выдает мне ошибку:
Undefined control sequence. ^^I{test test2}
Missing number, treated as zero. ^^I{test test2}
Missing = inserted for \ifnum. ^^I{test test2}
Missing number, treated as zero. ^^I{test test2}
Не могли бы вы помочь?
решение1
Проблема, судя по комментариям, решена, но я хочу предложить два разных подхода.
Во-первых, \newcommand
позволяет легко определять команды, которые имеют один необязательный аргумент, при условии, что это первый аргумент. Используя эту функцию, вы можете переписать свой макрос следующим образом:
\newcommand{\entry}[4][]{%
#2&\parbox[t]{11.2cm}{%
#3%
\hfill%
#4%
\if\relax\detokenize{#1}\relax\else\\#1\fi
}\\}
Говорит []
, что по умолчанию #1
пусто. Этот макрос по сути такой же, как ваш, за исключением того, что я переставил номера параметров. Главное отличие в том, как вы используете макрос:
\entry{second}{third}{fourth}
без необязательного параметра или, если вы хотите указать необязательный параметр:
\entry[first]{second}{third}{fourth}
Вторая альтернатива — использовать \NewDocumentCommand
изxparsepackage. Преимущество в \NewDocumentCommand
том, что он позволяет вам поместить необязательный аргумент где угодно, в том числе и в конце:
\NewDocumentCommand{\entry}{ mmmo }{%
#1&\parbox[t]{11.2cm}{%
#2%
\hfill%
#3%
\IfNoValueF{#4}{\\#4}% print #4 when it is given
}\\}
Говорит mmmo
, что есть триманологичные аргументы и одиноopional аргумент. Опять же, единственное реальное отличие вашего кода заключается в том, как используется макрос:
\entry{first}{second}{third}% without optional argument
\entry{first}{second}{third}[fourth]% with optional argument