Является ли этот жертвенный приказ хорошей идеей?

Является ли этот жертвенный приказ хорошей идеей?

У меня есть такая команда:

\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

Конечно, почему бы и нет. Ваше использование, ваш выбор.

В зависимости от конкретного приложения вы можете рассмотреть возможность использования \xdeftake, чтобы сделать (расширенное) переопределение глобальным или \protected@xdefучесть «странные конструкции» в именах...

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