交叉引用外部数据

交叉引用外部数据

是否有可用于引用外部数据的现有模块。例如,我想将我的分析结果添加到某种库中,并为其提供一个引文键,以便我可以在我的整个文本中使用。这样做的目的是通过使用引文键来避免错误/一致性问题,并且能够在分析被修改时快速更新整个手稿中的数据。

答案1

我将提供一个外部文件,例如myData.txt包含以下内容:

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

在您的主文档中,您可以使用 导入此文件\input{myData.txt}。然后您可以\myVariablePi在文档中将其用作变量。

附注1:如果您想在变量后留一个空格(或使用包),则可能需要在末尾加一个\myVariablePi{}( )。{}xspace

附注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 文件中,其名称为设置值
我把代码放在这些宏的位置用过的用于将值设置到另一个 .sty 文件中,其名称为MyValues.sty

当编译下面的示例时,这些.sty 文件将由于环境而自动创建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}

相关内容