newcommand - условное выполнение при пустом параметре

newcommand - условное выполнение при пустом параметре

У меня есть следующее определение команды (это запись списка записей), которое работает нормально:

\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

Связанный контент