我正在撰写一篇论文,并一直在寻找解决我编程问题的方法。基本上,我有一系列项目,我在研究数据中将其区分为“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 ***命令。
所以基本上,我看到实现这个结果的唯一方法是让代码提取并将最后一个数字(一到两位数长)转换成罗马数字。具体来说,我一直试图弄清楚如何做一些事情:
我尝试过多种不同的搜索方式,但似乎从来没有找到我需要回答的这两个问题...当我找到this网站时,我觉得我很接近但后来意识到这不是我追求的。 etextools LaTeX软件包也看起来很有前景,但我太过新手(甚至不是程序员)从我的TexLive(2010)安装附带的PDF帮助中找到了解。我也读过关于\ roman和\ romannumeral(例如,here)但是这两个命令在我因某些原因编译时会导致错误。在我的电脑上,\ roman {2}变为“roman”,而\ romannumeral {2}变为“2”。只是不明白它们是如何工作的。
非常感谢任何指导,演示代码或提示!谢谢。
答案 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
计数器。