Перекрестные ссылки на внешние данные

Перекрестные ссылки на внешние данные

Есть ли существующий модуль, который можно использовать для ссылки на внешние данные? Например, я хотел бы добавить результат моего анализа в какую-то библиотеку и дать ему ключ цитирования, который я могу использовать в своем тексте. Идея состоит в том, чтобы избежать ошибок/проблем с постоянством, используя ключ цитирования, и иметь возможность быстро обновлять данные в моей рукописи, если анализ будет изменен.

решение1

Я бы предоставил внешний файл, например, myData.txtсо следующим содержанием:

% Content of myData.txt
\newcommand{\myVariablePi}{3.14} 
\newcommand{\myVariableEuler}{2.71} 

В вашем основном документе вы можете импортировать этот файл с помощью \input{myData.txt}. Затем вы можете использовать его \myVariablePiкак переменную в документе.

Примечание 1:Вам может понадобиться \myVariablePi{}( {}в конце), если вы хотите поставить пробел после переменной (или использовать xspacepackage).

Примечание 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}

Связанный контент