%20para%20su%20uso%20posterior%3F.png)
Soy bastante nuevo en LaTeX y estoy luchando con algo aparentemente simple, pero para el cual no puedo encontrar una solución justa. El problema (simplificado) es el siguiente (tenga en cuenta que los términos utilizados pueden no tener el significado tradicional en LaTeX):
Necesito referencias a archivos (muchos) a lo largo de un texto. Por ejemplo, los archivos:
"C:/Work/this_file1.c"
, "C:/MoreWork/this_file1.c"
y "D:/MoreWork/another_file2.h"
.
Entonces, ahora me gustaría crear un "alias" para cada directorio y cada archivo de nombre para poder hacer referencia a ellos. Un "pseudocódigo" podría 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
Mi primer enfoque fue usar \newcommand
, pero eso causó numerosos problemas debido a limitaciones de nombres. (También probé otros métodos como pgfkeys
, ¡pero siempre se queda atascado en alguna parte!)
¿Puedes sugerir un método?
Respuesta1
Para nombres de alias más flexibles, puede hacerlo así. En los ejemplos eliminé el guión bajo; dependiendo del uso previsto, es posible que desee escapar de ellos ( \_
) o no ( _
).
\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}
Como lo sugiere @MaestroGlanz, los comandos \alias
y \A
se pueden definir de manera más compacta usando el paquete etoolbox
:
\usepackage{etoolbox}
\newcommand\alias[2]{\csdef{alias:#1}{#2}}
\newcommand\A[1]{\csuse{alias:#1}}
Como se mencionó en la pregunta original, aquí hay una pgfkeys
solución (aunque no conozco ninguna ventaja):
\usepackage{pgfkeys}
\newcommand\alias[2]{\pgfkeyssetvalue{/alias/#1}{#2}}
\newcommand\A[1]{\pgfkeysvalueof{/alias/#1}}
El resultado del documento de muestra en todas las versiones:
Respuesta2
Puedes usar \newcommand
, siempre y cuando los nombres de los comandos obedezcan las reglas de texto (esencialmente, constan de letras).
% 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
Respuesta3
Gracias por sus respuestas... fueron bastante útiles... y me hicieron ir un poco más allá.
Primero, la pregunta inicial no es tan clara como debería ser, por lo que un ejemplo más "real" debería ser suficiente:
En el documento LaTeX necesito "incluir" partes de archivos externos (normalmente código fuente de software). Los archivos fuente deben copiarse en una ubicación temporal y (importante) obtener un nombre temporal (algo como temp1.tmp
, temp2.tmp
... y así sucesivamente). [Nota: cómo se realiza la copia no es de importancia... sólo que se deben rastrear las rutas y los nombres de los archivos.]
Entonces, a continuación tengo la solución que estoy usando. Solo compartiendo...
\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}