是否存在可用於引用外部資料的現有模組。例如,我想將分析結果添加到某種庫中,並為其提供一個可以在整個文本中使用的引用鍵。這個想法是透過使用引用鍵來避免錯誤/一致性問題,並且如果分析被修改,則能夠快速更新整個手稿中的資料。
答案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。
我將程式碼放在這些巨集所在的位置用過的用於將值設定到另一個 .sty 檔案中,其名稱為我的價值觀.sty。
編譯下面的範例時,由於 -environments,這些 .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}