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.txt
com 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 \myVariablePi
como 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 xspace
pacote).
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.sty
contendo, 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 TEXMFHOME
no 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.sty
arquivo.
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}