LaTeX: извлечение чисел и букв из командных переменных и преобразование в римские цифры - PullRequest
0 голосов
/ 19 октября 2010

Я пишу диссертацию и много раз искал, пытаясь найти решение моей проблемы программирования. По сути, у меня есть ряд элементов, которые я выделил в своих данных исследований как «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} становится «римским», а \ romannumeral {2} становится «2». Просто не понимаю, как они работают.

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

1 Ответ

1 голос
/ 20 октября 2010

Вот пример, который работает для меня:

\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 счетчик).

...