%20para%20uso%20posterior%3F.png)
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 \alias
e \A
podem 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 pgfkeys
soluçã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:
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}