我想调用宏\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}