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