Латекс: Извлечение номеров и букв от переменных команд и преобразования в римские цифры

StackOverflow https://stackoverflow.com/questions/3965761

Вопрос

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

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

и так далее. В основном, как вы можете видеть, я назвал команду как « dataname», а затем букву (в CAPS), а затем номер, выписанный как римские цифры. Это было все вручную, и я сделал это только потому, что латекс, казалось, не любил никаких арабских чисел в команде. Если это разрешено это, я бы использовал 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 ***. То есть тип POTENTATA {E10}, например, а затем есть латекс нагрузки что-то вроде:

«Это [данные 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 *** в NewCommand NewCommand.

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

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

Я пробовал поиск во многих разных отношениях, но никогда, кажется, не найду, что мне нужно ответить на эти два вопроса ... Я думал, что я был близок, когда нашел это Сайт, но позже понял, что это не то, что я после. The Etextools LaTex Package также выглядел многообещающим, но я слишком начинающий (даже не программист), чтобы иметь большой смысл из помощи PDF, который поставляется с моим Texlive (2010) установкой. Я также читал о Roman и Romannumeral (например, здесь) Но эти две команды вызывают ошибки, когда я скомпилируюсь по какой-то причине. На моем компьютере Roman {2} становится «римским», а Romannumeral {2} становится «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 принимает разграниченный аргумент (разграниченный финальным $). После этого это просто случай построения названия макроса, который вы хотите позвонить (используя \csname) и используя \roman Чтобы отформатировать номер как римские цифры. (Я думаю, что причина, по которой вы не могли заставить это работать, это потому, что вы не проходили \roman счетчик).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top