
Если я напишу:
\documentclass[a4paper]{report}
\begin{document}
\lowercase{Norma}
\end{document}
Я получаю "norma" в выводе, в нижнем регистре, как я и хотел. Однако, если я напишу:
\documentclass[a4paper]{report}
\expandafter\def\csname mw@mu\endcsname{Norma}
\begin{document}
\lowercase{\csname mw@mu\endcsname}
\end{document}
Я получаю "Norma", с заглавной буквы, которая мне не нужна. Я пробовал ставить \noexpand
перед \lowercase
, и окружать \lowercase
s \expandafter
, но безрезультатно: заглавная буква всегда там. Как мне это исправить?
решение1
Команды \lowercase
и \uppercase
не расширяют свое содержимое; они просто преобразуют токены символов в своем аргументе и возвращают список токенов во входной поток.
В вашем коде возможному изменению регистра подвержены m
w
@
m
и u
; действительно, если вы попробуете
\lowercase{\csname MW@MU\endcsname}
вы получите тот же результат, что и
\lowercase{\csname mw@mu\endcsname}
Чтобы упростить пример:
\def\Norma{Norma}
\lowercase{\Norma}
напечатает
Норма
потому что символические токены не трогаются \lowercase
. Если вы действительно хотите сделать расширение строчными, \Norma
вы должны сказать
\lowercase\expandafter{\Norma}
но только первый токен будет расширен, а не другие токены, следующие за ним. Для макроса, указанного с \csname
вам нужно
\lowercase\expandafter\expandafter\expandafter{\csname mw@mu\endcsname}