%20zur%20sp%C3%A4teren%20Verwendung%20zu%20speichern%3F.png)
Ich bin ziemlich neu bei LaTeX und kämpfe mit etwas scheinbar Einfachem, für das ich aber keine vernünftige Lösung finde. Das Problem (vereinfacht) ist wie folgt (bitte beachten Sie, dass die verwendeten Begriffe in LaTeX möglicherweise nicht die traditionelle Bedeutung haben):
Ich brauche Verweise auf Dateien (viele) im gesamten Text. Beispielsweise die Dateien:
"C:/Work/this_file1.c"
, "C:/MoreWork/this_file1.c"
und "D:/MoreWork/another_file2.h"
.
Ich möchte nun für jedes Verzeichnis und jede Namensdatei einen „Alias“ erstellen, damit ich sie referenzieren kann. Ein „Pseudocode“ könnte sein:
% 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
Mein erster Ansatz war die Verwendung von \newcommand
, was jedoch aufgrund von Benennungsbeschränkungen zu zahlreichen Problemen führte. (Ich habe auch andere Methoden wie ausprobiert pgfkeys
, aber es bleibt immer irgendwo hängen!)
Können Sie eine Methode vorschlagen?
Antwort1
Für flexiblere Aliasnamen können Sie es wie folgt machen. In den Beispielen habe ich die Unterstriche entfernt; je nach beabsichtigter Verwendung möchten Sie sie vielleicht maskieren ( \_
) oder nicht ( _
).
\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}
Wie von @MaestroGlanz vorgeschlagen, können die Befehle \alias
und \A
mithilfe des Pakets kompakter definiert werden etoolbox
:
\usepackage{etoolbox}
\newcommand\alias[2]{\csdef{alias:#1}{#2}}
\newcommand\A[1]{\csuse{alias:#1}}
Da in der ursprünglichen Frage erwähnt, hier eine pgfkeys
Lösung (obwohl mir kein Vorteil bekannt ist):
\usepackage{pgfkeys}
\newcommand\alias[2]{\pgfkeyssetvalue{/alias/#1}{#2}}
\newcommand\A[1]{\pgfkeysvalueof{/alias/#1}}
Das Ergebnis des Beispieldokuments in allen Versionen:
Antwort2
Sie können einfach verwenden \newcommand
, solange die Befehlsnamen den Tex-Regeln entsprechen (im Wesentlichen aus Buchstaben bestehen).
% 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
Antwort3
Vielen Dank für Ihre Antworten. Sie waren sehr hilfreich und haben mich ein Stück weitergebracht.
Erstens ist die ursprüngliche Frage nicht so klar, wie sie sein sollte. Ein „realistischeres“ Beispiel sollte also genügen:
Im LaTeX-Dokument muss ich Teile externer Dateien (normalerweise Software-Quellcode) „einbinden“. Die Quelldateien müssen an einen temporären Speicherort kopiert werden und (wichtig) einen temporären Namen erhalten (etwa temp1.tmp
, temp2.tmp
… usw.). [Hinweis: Wie die Kopie erstellt wird, ist nicht von Belang … nur die Pfade und Dateinamen müssen nachverfolgt werden.]
Unten habe ich die Lösung, die ich verwende. Ich teile sie nur ...
\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}