LaTeX:从命令变量中提取数字和字母,并转换为罗马数字

时间:2010-10-19 06:15:19

标签: latex numbers roman-numerals xelatex

我正在撰写一篇论文,并一直在寻找解决我编程问题的方法。基本上,我有一系列项目,我在研究数据中将其区分为“A1”,“A2”,“A3”,......,“A13”,“B1”,B2“等。这些数据标签顺便说一句,我现在无法改变,因为它在我的论文中被使用过。它们总是被格式化为[caps-letter] [数字(长度为1到2个字符)],例如,X20或L9。对于每个数据item,我想指定一个特定的名称。由于LaTeX不允许命令中的数字,我已经创建了以下类型的命令的LONG列表,为每个数据标签分配名称:

\newcommand{\DataNameAi}[]%
 {Data name for A1}
\newcommand{\DataNameAii}[]%
 {Data name for A2}
% …
\newcommand{\DataNameXxi}[]%
 {Data name for X11}
% …

等等。基本上,正如您所看到的,我已将命令命名为“\ DataName”,后跟字母(大写字母),后面跟着写为罗马数字的数字。这都是手动完成的,我这样做只是因为LaTeX似乎不喜欢命令名中的任何阿拉伯数字。如果它允许这样做,我会使用\ DataNameA1等。

在其他地方,我也有一个专门引用数据的命令:

\newcommand{\GotoData}[1]%
 {\hyperref[data#1]{Data~#1}}
See data at \Gotodata{E10} % this links to another location labelled \label{dataE10}

现在,我想现在分配一个乳胶命令,它只能接受一个变量,数据标签(无论是“Q30”还是“A3”),并使用\ GotoData命令以及在\ DataName ***命令中显示相应的数据名称。也就是说,例如,键入\ CompleteData {E10},然后加载LaTeX,如:

“这是[数据E10],名为[E10的数据名称]。”

这意味着该命令可能类似于:

\newcommand{\CompleteData}[1]%
{This is [\GotoData{#1}] named [\DataNameEx].}

\CompleteData{E10} % <--- this should look like "This is [Data E10] named [Data name for E10]."

正如您所看到的,上面的代码是不完整的:我一直坚持如何使用#1变量在\ CompleteData newcommand中生成必要的\ DataName ***命令。

所以基本上,我看到实现这个结果的唯一方法是让代码提取并将最后一个数字(一到两位数长)转换成罗马数字。具体来说,我一直试图弄清楚如何做一些事情:

  1. 如何从新命令中的参数末尾提取数字(例如我的“Q31”或“A1”参数中的数字)。
  2. 同样从参数
  3. 的第一个字符中提取字母
  4. 如何将数字转换为数字
  5. 我尝试过多种不同的搜索方式,但似乎从来没有找到我需要回答的这两个问题...当我找到this网站时,我觉得我很接近但后来意识到这不是我追求的。 etextools LaTeX软件包也看起来很有前景,但我太过新手(甚至不是程序员)从我的TexLive(2010)安装附带的PDF帮助中找到了解。我也读过关于\ roman和\ romannumeral(例如,here)但是这两个命令在我因某些原因编译时会导致错误。在我的电脑上,\ roman {2}变为“roman”,而\ romannumeral {2}变为“2”。只是不明白它们是如何工作的。

    非常感谢任何指导,演示代码或提示!谢谢。

1 个答案:

答案 0 :(得分:1)

这是一个适合我的例子:

\documentclass{article}
\usepackage{hyperref}

\newcommand{\DataNameAii}{Data name for A2}
\newcommand{\GotoData}[1]{\hyperref[data#1]{Data~#1}}

\newcommand{\CompleteData}[1]{This is [\GotoData{#1}] named [\FormatDataName#1$].}
\newcounter{DataNumber}
\def\FormatDataName#1#2${\setcounter{DataNumber}{#2}\csname DataName#1\roman{DataNumber}\endcsname}

\begin{document}
\section{Data A2}\label{dataA2}
\CompleteData{A2}
\end{document}

\FormaDataName将第一个字符提取到#1,将数字提取到#2。它使用\FormatDataName采用分隔参数(由最终$分隔)的事实来做到这一点。之后,只是构建要调用的宏名称(使用\csname),并使用\roman将数字格式化为罗马数字。 (我认为你无法让这个工作的原因是因为你没有通过\roman计数器。