Referência cruzada de dados externos

Referência cruzada de dados externos

Existe um módulo existente que pode ser usado para fazer referência a dados externos. Por exemplo, gostaria de adicionar o resultado da minha análise a algum tipo de biblioteca e fornecer-lhe uma chave de citação que possa usar em todo o meu texto. A ideia é evitar erros/problemas de constância usando uma chave de citação e poder atualizar rapidamente os dados ao longo do meu manuscrito caso a análise seja modificada.

Responder1

Eu forneceria um arquivo externo, por exemplo, myData.txtcom o seguinte conteúdo:

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

No seu documento principal, você pode importar este arquivo com a extensão \input{myData.txt}. Então você pode usar \myVariablePicomo variável no documento.

Nota lateral 1:Você pode precisar de um \myVariablePi{}( {}no final) se quiser ter um espaço após a variável (ou usar xspacepacote).

Nota lateral 2:Certifique-se de que suas afirmações ainda sejam verdadeiras após atualizar as variáveis ​​:).

Responder2

À luz do comentário, você poderia fazer o seguinte: Criar um arquivo my-variables.stycontendo, por exemplo

\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}}

e coloque em sua árvore texmf inicial. Para mim, em um computador Linux, isso é ~/texmf/tex/latex/local. O diretório correto para você deve ser descoberto executando kpsewhich -var-value TEXMFHOMEno terminal.

Agora você pode usar sua “biblioteca”, por exemplo, escrevendo o seguinte arquivo tex:

\documentclass{article}
\usepackage{my-variables}
\begin{document}
    The speed of light is \getvariable{speed-of-light}.
\end{document}

Esta deve ser a velocidade correta da luz salva em seu my-variables.styarquivo.

Nota:Imagine que você deseja destacar todas as variáveis ​​que são lidas no seu arquivo de biblioteca. Um caso de uso para isso que eu poderia imaginar é que você deseja folhear rapidamente um documento e ter certeza de que todas as quantidades foram realmente lidas em sua biblioteca. Com minha solução sugerida, você pode simplesmente fazer

\renewcommand{\getvariable}[1]{%
    \colorbox{yellow!50}{\csname myv@riable@#1\endcsname}
}

ou o que você quiser fazer para destacar equações.

Responder3

Elaborando sobre osolução de Bubaya pode-se adicionar um pouco de gerenciamento de erros no caso de alguém erroneamente, por exemplo, devido a um erro de digitação, tentar obter valores que não estão definidos ou tentar definir valores que já estão definidos.

Coloquei o código onde estão as macros para definir e recuperar valoresdefiniramem um arquivo .sty próprio, cujo nome éSetValues.sty.
Coloquei o código onde estão essas macrosusadopara definir os valores em outro arquivo .sty por conta própria, cujo nome éMeus Valores.sty.

Ao compilar o exemplo abaixo, esses arquivos .sty serão criados automaticamente devido aos filecontents*-environments.

Se desejar, você pode mesclar os dois arquivos .sty.

Não fiz isso porque alguém poderia querer usar essas macros também com outros projetos e outros conjuntos de valores. ;-)

\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}

informação relacionada