csname 中的宏

csname 中的宏

我想调用宏\PsalmY{},其中“Y”是罗马大写数字(此宏显示诗篇 n°Y)。例如,\PsalmII{} 将显示诗篇 2。

因此我创建了一个宏:

\newcommand{\Psalmus}[1]{\csname Psalm\romannumeral#1\endcsname}

但宏\romannumeral输出的是小写罗马数字。我尝试了以下代码,但没有效果:

\newcommand{\Psalmus}[1]{\csname Psalm\MakeUppercase{\romannumeral#1}\endcsname}

我可以决定使用小罗马数字,但可读性会较差。

答案1

根据你之前的问题诗篇数据库并自我回答,你会得到类似

\newcommand{\PsalmI}{%
  <text of Psalm 1>
}
\newcommand{\PsalmII}{%
  <text of Psalm 2>
}

[1]从您展示的代码中删除了,因为它确实是错误的,因为您没有参数。

现在您需要一个类似于\Psalmus{22}排版诗篇 22 的界面。使用 LaTeX 的标准(内部)命令可以实现这一点:

\makeatletter
\newcommand{\Psalmus}[1]{\csname Psalm\@Roman{#1}\endcsname}
\makeatother

让我们尝试一下,使用一个删节版。

\documentclass{article}
\usepackage[T1]{fontenc}

% this will probably be in a separate file that you \input
\newcommand{\PsalmI}{%
  <text of Psalm 1>
}
\newcommand{\PsalmII}{%
  <text of Psalm 2>
}
\newcommand{\PsalmXXII}{%
  <text of Psalm 22>
}
%%%

\makeatletter
\newcommand{\Psalmus}[1]{\csname Psalm\@Roman{#1}\endcsname}
\makeatother

\begin{document}

\Psalmus{2}

\Psalmus{22}

\end{document}

在此处输入图片描述

另一方面,我会用不同的方式来做,而不需要来回转换成罗马数字。

\documentclass{article}
\usepackage[T1]{fontenc}

% this will probably be in a separate file that you \input
\makeatletter
\newcommand{\definepsalm}[2]{\@namedef{psalm#1}{#2}}
\newcommand{\Psalmus}[1]{\@nameuse{psalm#1}}
\makeatother

\definepsalm{1}{%
  <text of Psalm 1>
}
\definepsalm{2}{%
  <text of Psalm 2>
}
\definepsalm{22}{%
  <text of Psalm 22>
}
%%%

\begin{document}

\Psalmus{2}

\Psalmus{22}

\end{document}

答案2

需要先展开\romannumeral,再应用\uppercase。使用辅助宏会更简单。

\makeatletter
\newcommand\@Psalm{Psalm}
\newcommand\Psalmus[1]{\uppercase\expandafter{\expandafter\csname\expandafter\@Psalm\romannumeral#1\endcsname}}
\makeatother

答案3

\makeatletter
%% \Psalm<stuff not in braces>{<number>}
%% ->  <stuff not in braces>\Psalm<uppercased-roman-representation of <number>>
%% (<stuff not in braces> may be empty.)
\@ifdefinable\Psalm{\long\def\Psalm#1#{\@Psalm{#1}}}%
\newcommand\@Psalm[2]{\expandafter\exchange\expandafter{\csname Psalm\@Roman{#2}\endcsname}{#1}}%
\newcommand\exchange[2]{#2#1}%
\makeatother

\documentclass{article}

%\newcommand*\PsalmII{%
\Psalm\newcommand*{2}{%
  Why do the nations rage\\%
  and the peoples plot in vain?\\%
  \dots
}%

%\newcommand*\PsalmXXIII{%
\Psalm\newcommand*{23}{%
  The Lord is my shepherd; I shall not want.\\%
  He makes me lie down in green pastures.\\%
  \dots
}%

\begin{document}

\noindent\Psalm{2}

\bigskip

\noindent\Psalm{23}

\bigskip

\noindent\PsalmII

\bigskip

\noindent\PsalmXXIII

\end{document}

在此处输入图片描述

答案4

定义 1 到 100:

\documentclass{article}
\ExplSyntaxOn
\cs_new_eq:NN \Repeat \prg_replicate:nn
\ExplSyntaxOff

\newcounter{rnum}
\setcounter{rnum}{1}

\Repeat{100}{\expandafter\edef\csname Psalm\Roman{rnum}\endcsname{Psalm \thernum}
\stepcounter{rnum}
}

\begin{document}
\PsalmI

\PsalmII

\PsalmIV

\PsalmVII

\PsalmIX

\PsalmX

\PsalmXV

\PsalmXXI

\PsalmXLVII

\PsalmLXXII

\PsalmXCIX

\PsalmC
\end{document}

相关内容