Латекс: Извлечение номеров и букв от переменных команд и преобразования в римские цифры
-
09-10-2019 - |
Вопрос
Я пишу тезис и искал во многих случаях, пытаясь найти решение моей проблемы программирования. По сути, у меня есть серия предметов, которые я отличался в моих исследованиях, как «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.
Так что очень принципиально, я вижу единственный способ, которым достижение этого результата - иметь экстракт кода и преобразовать последнее число (от одного до двух цифр) в римскую цифру. В частности, я пытался выяснить, как сделать несколько вещей:
- Как извлекать только цифры из конца параметра в NewCommand (например, цифры в моем параметрах «Q31» или «A1»).
- Аналогичным образом извлеките письмо от первого символа параметра
- Как конвертировать цифры на цифры
Я пробовал поиск во многих разных отношениях, но никогда, кажется, не найду, что мне нужно ответить на эти два вопроса ... Я думал, что я был близок, когда нашел это Сайт, но позже понял, что это не то, что я после. 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
счетчик).