У меня есть такая команда:
\newcommand{\name}[1]{\edef\name{#1}}
Сначала вы вызываете его как in \name{Don}
, а затем можете ссылаться на Don, используя \name
.Приемлемо ли это для выражения константы, которая должна быть установлена только один раз?
решение1
Я бы использовал разные команды: одну для хранения имени, а другую для его установки.
В пакете общепринятой практикой является использование внешней версии команды ( \name
) для установки значения внутреннего макроса ( \@name
). Вот как \author
и \title
работают в article
классе.
\makeatletter
\newcommand{\name}[1]{\gdef\@name{#1}}
\makeatother
Но было бы понятнее и проще, если бы вы использовали разные типы команд для указания разного поведения. Так \name
расширяется до имени и \setname
определяет значение \name
:
\newcommand{\setname}[1]{\gdef\name{#1}}
Хорошо различать команды, указывающие материал, который будет набран, и команды, определяющие константы. По моему мнению, команды по умолчанию \author
и \title
в LaTeX должны быть \setauthor
и \settitle
, поскольку фактическая набранная информация появляется только тогда, когда вы даете команду \maketitle
.
решение2
Конечно, почему бы и нет. Ваше использование, ваш выбор.
В зависимости от конкретного приложения вы можете рассмотреть возможность использования \xdef
take, чтобы сделать (расширенное) переопределение глобальным или \protected@xdef
учесть «странные конструкции» в именах...