0

我正在写一篇论文,并且在很多场合都在寻找解决我的编程问题的方法。基本上,我有一系列项目,我在我的研究数据中区分为“A1”、“A2”、“A3”、……、“A13”、“B1”、B2 等等。这些数据标签, 顺便说一句, 我现在不能更改, 因为它在我的论文中一直使用. 它们总是格式化为 [caps-letter][digit(length of 1 to 2 chars)], 例如, X20 或 L9. 对于每个数据项目,我想指定一个特定的名称。因为 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 命令以及在 \数据名称*** 命令。也就是说,例如,键入 \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. 如何将数字转换为数字

我尝试了许多不同的方式进行搜索,但似乎从来没有找到我需要回答这两个问题的内容……当我找到这个 网站时,我以为我已经很接近了,但后来意识到这不是我想要的。etextools LaTeX 包看起来也很有希望,但我太新手(甚至不是程序员),无法从我的 TexLive (2010) 安装附带的帮助 PDF 中理解。我还阅读了有关 \roman 和 \romannumeral 的信息(例如,here),但是当我出于某种原因编译时,这两个命令会导致错误。在我的电脑上,\roman{2} 变成了“roman”,而 \romannumeral{2} 变成了“2”。只是不明白它们是如何工作的。

任何指导、演示代码或提示将不胜感激!谢谢你。

4

1 回答 1

2

这是一个对我有用的例子:

\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带分隔参数(由 final 分隔$)的事实来做到这一点。之后,只需构造您要调用的宏名称(使用\csname),并使用\roman将数字格式化为罗马数字。(我认为你不能让它工作的原因是因为你没有通过\roman柜台)。

于 2010-10-20T08:15:24.823 回答