LaTeX: извлечение цифр и букв из командных переменных и преобразование в римские цифры.

Я пишу диссертацию и много раз искал решение своей проблемы с программированием. По сути, у меня есть ряд элементов, которые я выделил в своих исследовательских данных как «A1», «A2», «A3», …, «A13», «B1», B2 и т. д. Эти метки данных , кстати, я не могу изменить сейчас, потому что это использовалось во всей моей диссертации.Они всегда имеют формат [заглавные буквы][цифра (длина от 1 до 2 символов)], например, X20 или L9. Для каждых данных элемент, я хочу присвоить конкретное имя.Поскольку LaTeX не допускает использование чисел в команде, я уже создал ДЛИННЫЙ список следующих типов команд для присвоения имен каждой метке данных:

\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 для создания необходимой команды \DataName*** в новой команде \CompleteData.

В общем, я вижу единственный способ добиться этого результата - извлечь код и преобразовать последнее число (длиной от одной до двух цифр) в римскую цифру. В частности, я пытался выяснить, как сделать несколько вещей:

  1. как извлечь только цифры из конца параметра в новой команде (например, цифры в моих параметрах «Q31» или «A1»).
  2. аналогично извлечь букву из первого символа параметра
  3. как преобразовать числа в цифры

Я пытался искать разными способами, но, похоже, так и не нашел то, что мне нужно, чтобы ответить на эти два вопроса… Я думал, что был близок, когда нашел этот сайт, но позже понял, что это не то, что мне нужно. Пакет etextools LaTeX также выглядел многообещающе, но я слишком новичок (даже не программист), чтобы разобраться в справочном PDF-файле, прилагаемом к моей установке TexLive (2010). Я также читал о \roman и \romannumeral (например, здесь), но эти две команды вызывают ошибки при компиляции по какой-то причине. На моем компьютере \roman{2} становится "roman", а \romannumeral{2} становится "2". Просто не понимаю, как они работают.

Будем очень благодарны за любые рекомендации, демонстрационный код или подсказки! Спасибо.


person stahmo    schedule 19.10.2010    source источник
comment
Возможно, вам повезет больше спросить на tex.stackexchange.com.   -  person Agent_9191    schedule 19.10.2010
comment
Мне жаль, что это не ответ, но для латекса есть специальный сайт обмена стеками: tex.stackexchange.com. Может быть, высшие силы смогут перенесите свой вопрос туда.   -  person gideon    schedule 19.10.2010


Ответы (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 счетчик).

person Tom    schedule 20.10.2010
comment
Привет Том, большое спасибо за ваш ответ. Ваш код отлично работает для моих целей. Я просто хочу, чтобы я. Понятия не имею, как это работает, но работает. Сейчас я пытаюсь понять, как принять твой ответ, Том, и поставить тебе заслуженные 15 баллов. Еще раз спасибо. :) - person stahmo; 31.10.2010