Qual é a melhor maneira de salvar valores (como strings) para uso posterior?

Qual é a melhor maneira de salvar valores (como strings) para uso posterior?

Sou bastante novo no LaTeX e estou lutando com algo aparentemente simples, mas para o qual não consigo encontrar uma solução justa. O problema (simplificado) é o seguinte (tome cuidado, os termos usados ​​podem não ter o significado tradicional em LaTeX):

Preciso de referências a arquivos (muitos) ao longo de um texto. Por exemplo, os arquivos: "C:/Work/this_file1.c", "C:/MoreWork/this_file1.c"e "D:/MoreWork/another_file2.h".

Então, agora eu gostaria de criar um "alias" para cada diretório e cada arquivo de nome para poder referenciá-los. Um "pseudocódigo" poderia ser:

% Definition
\alias \c_dir = C:/Work/
\alias \d_dir = D:/MoreWork/
\alias \file1 = this_file1.c
\alias \file2 = another_file2.h

% Reference in text
\c_dir\file1    % For referencing C:/Work/this_file1.c
\d_dir\file1    % For referencing D:/MoreWork/this_file1.c
\c_dir\file2    % For referencing C:/Work/another_file2.h

Minha primeira abordagem foi usar \newcommand, mas isso causou vários problemas devido a limitações de nomenclatura. (Eu também tentei outros métodos como pgfkeys, mas sempre fica preso em algum lugar!)

Você pode sugerir um método?

Responder1

Para nomes de alias mais flexíveis, você pode fazer assim. Nos exemplos removi o sublinhado; dependendo do uso pretendido você pode querer escapar deles ( \_) ou não ( _).

\documentclass{article}
\newcommand\alias[2]{\expandafter\def\csname alias:#1\endcsname{#2}}
\newcommand\A[1]{\csname alias:#1\endcsname}

\alias{c_dir}{C:/Work/}
\alias{d_dir}{D:/MoreWork/}
\alias{file1}{thisFile1.c}
\alias{file2}{anotherFile2.h}

\begin{document}
\A{c_dir}\A{file1}

\A{d_dir}\A{file1}

\A{c_dir}\A{file2}
\end{document}

Conforme sugerido por @MaestroGlanz, os comandos \aliase \Apodem ser definidos de forma mais compacta usando o pacote etoolbox:

\usepackage{etoolbox}
\newcommand\alias[2]{\csdef{alias:#1}{#2}}
\newcommand\A[1]{\csuse{alias:#1}}

Porque mencionado na pergunta original, aqui está uma pgfkeyssolução (embora eu não tenha conhecimento de nenhuma vantagem):

\usepackage{pgfkeys}
\newcommand\alias[2]{\pgfkeyssetvalue{/alias/#1}{#2}}
\newcommand\A[1]{\pgfkeysvalueof{/alias/#1}}

O resultado do documento de amostra em todas as versões:

insira a descrição da imagem aqui

Responder2

Você pode simplesmente usar \newcommand, desde que os nomes dos comandos obedeçam às regras do tex (consistem em letras, essencialmente).

% Definition
\newcommand\cdir{C:/Work/}
\newcommand\ddir{D:/MoreWork/}
\newcommand\fileA{this\_file1.c}
\newcommand\fileB{another\_file2.h}

% Reference in text
\cdir\fileA    % For referencing C:/Work/this_file1.c
\ddir\fileA    % For referencing D:/MoreWork/this_file1.c
\cdir\fileB    % For referencing C:/Work/another_file2.h

Responder3

Obrigado pelas vossas respostas... que foram bastante úteis... e que me fizeram ir um pouco mais longe.

Primeiro, a questão inicial não é tão clara quanto deveria ser, então um exemplo mais 'real' deve resolver:

No documento LaTeX preciso "incluir" partes de arquivos externos (normalmente código-fonte do software). Os arquivos de origem precisam ser copiados para um local temporário e (Importante) obter um nome temporário (algo como temp1.tmp, temp2.tmp... e assim por diante). [Nota: como a cópia é feita não é motivo de preocupação... apenas que os caminhos e nomes de arquivos devem ser rastreados.]

Então, abaixo tenho a solução que estou usando. Apenas compartilhando...

\documentclass{article}

\usepackage{keyval}
\makeatletter
\newcounter{cntTmp}
\newcommand{\mylongS}[4]{
    % In here I pass the source and destination file parameters
    srcDir: #1; srcFile: #2; dstDir: #3; dstFile: #4    

    %I Now use the parameters to create a string to store in a just-defined key
    \define@key{}{this\arabic{cntTmp}}[]{#1:#2:#3:#4}
    \stepcounter{cntTmp}
}

\makeatother

\begin{document}
    % This should "account" as the first file copied... to temp0.tmp    
    \mylongS{S:/work}{testtxt}{t}{temp0.tmp}

    % This should "account" as the SECOND file copied... to temp1.tmp   
    \mylongS{S:/work}{testtxt}{t}{temp1.tmp}

    % Now I have access to the full string... and may use string manipulation
    \setkeys{}{this0}

    \setkeys{}{this1}
\end{document}

informação relacionada