Есть ли существующий модуль, который можно использовать для ссылки на внешние данные? Например, я хотел бы добавить результат моего анализа в какую-то библиотеку и дать ему ключ цитирования, который я могу использовать в своем тексте. Идея состоит в том, чтобы избежать ошибок/проблем с постоянством, используя ключ цитирования, и иметь возможность быстро обновлять данные в моей рукописи, если анализ будет изменен.
решение1
Я бы предоставил внешний файл, например, myData.txt
со следующим содержанием:
% Content of myData.txt
\newcommand{\myVariablePi}{3.14}
\newcommand{\myVariableEuler}{2.71}
В вашем основном документе вы можете импортировать этот файл с помощью \input{myData.txt}
. Затем вы можете использовать его \myVariablePi
как переменную в документе.
Примечание 1:Вам может понадобиться \myVariablePi{}
( {}
в конце), если вы хотите поставить пробел после переменной (или использовать xspace
package).
Примечание 2:Убедитесь, что ваши утверждения остаются верными после обновления переменных :).
решение2
В свете комментария вы можете сделать следующее: создать файл, my-variables.sty
содержащий, например,
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{my-variables}
\RequirePackage{siunitx}
% Commands for setting and getting variables
\newcommand{\setvariable}[2]{
\expandafter\def\csname myv@riable@#1\endcsname{#2}
}
\newcommand{\getvariable}[1]{%
\csname myv@riable@#1\endcsname
}
% My variable variable definitions
\setvariable{speed-of-light}{\SI{299 792 458}{m/s}}
и поместите в свой домашний texmf-tree. Для меня на компьютере Linux это ~/texmf/tex/latex/local
. Правильный каталог для вас должен быть найден путем запуска kpsewhich -var-value TEXMFHOME
на терминале.
Теперь вы можете воспользоваться своей «библиотекой», например, написав следующий tex-файл:
\documentclass{article}
\usepackage{my-variables}
\begin{document}
The speed of light is \getvariable{speed-of-light}.
\end{document}
Это должно быть правильное значение скорости света, сохраненное в вашем my-variables.sty
файле.
Примечание:Представьте, что вы хотите выделить все переменные, которые считываются из вашего библиотечного файла. Пример использования этого, который я могу себе представить, заключается в том, что вы хотите быстро просмотреть документ и убедиться, что все величины действительно считываются из вашей библиотеки. С моим предложенным решением вы можете просто сделать
\renewcommand{\getvariable}[1]{%
\colorbox{yellow!50}{\csname myv@riable@#1\endcsname}
}
или что-нибудь еще, что вы хотите сделать, чтобы выделить уравнения.
решение3
Подробно останавливаясь нарешение Бубайи можно было бы добавить немного управления ошибками на случай, если кто-то по ошибке, например, из-за опечатки, попытается получить значения, которые не определены, или попытается определить значения, которые уже определены.
Я поместил код, где макросы для установки и получения значенийопределенныйв отдельный .sty-файл, имя которогоSetValues.sty.
Я поместил код, где находятся эти макросы.использовалдля установки значений в другой .sty-файл, имя которогоМоиЦенности.sty.
При компиляции примера ниже эти .sty-файлы будут созданы автоматически благодаря -environments filecontents*
.
При желании вы можете объединить два .sty-файла.
Я этого не сделал, поскольку кто-то мог захотеть использовать эти макросы также и с другими проектами и другими наборами значений. ;-)
\documentclass{article}
% Let LaTeX create the file SetValues.sty in case it does not already exist
% on the system:
\begin{filecontents*}{SetValues.sty}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{SetValues}
\newcommand\SetValues@Exchange[2]{#2#1}%
\newcommand\SetValues@Name{}%
\long\def\SetValues@Name#1#{\romannumeral0\SetValues@@Name{#1}}%
\newcommand\SetValues@@Name[2]{%
\expandafter\SetValues@Exchange\expandafter{\csname#2\endcsname}{ #1}%
}%
\DeclareRobustCommand\GetValue[1]{%
\@ifundefined{SetValues@@@#1}%
{%
\SetValues@UndefText
\GenericError{\space\@spaces\@spaces}%
{Error: Value `#1' not defined}%
{Source for further information on this error is neither available nor needed.}%
{It was attempted to obtain a value with name `#1'\MessageBreak%
although such a value is not defined.\MessageBreak%
Either the intended value has another name (typo or the like?)\MessageBreak%
or it needs to be defined.%
}%
}{%
\SetValues@Name{SetValues@@@#1}%
}%
}%
\DeclareRobustCommand\SetValue[1]{%
\@ifundefined{SetValues@@@#1}%
{\SetValues@Name\newcommand*{SetValues@@@#1}}%
{%
\GenericError{\space\@spaces\@spaces}%
{Error: Value `#1' already defined}%
{Source for further information on this error is neither available nor needed.}%
{A value with name `#1' is already defined.\MessageBreak%
Either choose another name for the value\MessageBreak%
or modify the existing definition.%
}%
}%
}%
\@onlypreamble\SetValue
\AtBeginDocument{%
\@ifpackageloaded{hyperref}{%
\DeclareRobustCommand\SetValues@UndefText{%
\texorpdfstring{\nfss@text{\reset@font\bfseries ??}}{??}%
}%
}{%
\DeclareRobustCommand\SetValues@UndefText{%
\nfss@text{\reset@font\bfseries ??}%
}%
}%
}%
\endinput
\end{filecontents*}
% Let LaTeX create the file MyValues.sty in case it does not already exist
% on the system:
\begin{filecontents*}{MyValues.sty}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{MyValues}
\RequirePackage{SetValues}
%
% At this place you can require whatever additional packages you
% need for having LaTeX typeset your values nicely:
\RequirePackage{siunitx}
%\RequirePackage ...
%
% Now do a sequence of calls to \SetValue for defining values:
\SetValue{ApproxPi}{\num{3.1415927}}%
%\SetValue...
%
\endinput
\end{filecontents*}
%\usepackage{SetValues} % Actually you don't need to require the
% SetValues-package as it is also required
% by the MyValues-package.
\usepackage{MyValues}
\begin{document}
$\pi$ is approximately \GetValue{ApproxPi}
\end{document}