外部データの相互参照

外部データの相互参照

外部データを参照するために使用できる既存のモジュールはありますか。たとえば、分析結果を何らかのライブラリに追加し、テキスト全体で使用できる引用キーを付与したいと考えています。引用キーを使用することで間違いや一貫性の問題を回避し、分析が変更された場合に原稿全体でデータをすばやく更新できるようにするのが目的です。

答え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ファイルに名前をつけて保存します。SetValues.styこれら
のマクロがあるところにコードを配置します使用済み値を別の.styファイルに設定するためのもので、そのファイルの名前はマイバリューズ

以下の例をコンパイルすると、-environments によりこれらの .sty ファイルが自動的に作成されますfilecontents*

必要に応じて、2 つの .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}

関連情報