Каков наилучший способ сохранения значений (например, строк) для последующего использования?

Каков наилучший способ сохранения значений (например, строк) для последующего использования?

Я новичок в LaTeX и борюсь с чем-то, казалось бы, простым, но для чего не могу найти справедливого решения. Проблема (упрощенно) заключается в следующем (обратите внимание, что используемые термины могут не иметь традиционного значения в LaTeX):

Мне нужны ссылки на файлы (много) по всему тексту. Например, файлы: "C:/Work/this_file1.c", "C:/MoreWork/this_file1.c"и "D:/MoreWork/another_file2.h".

Итак, теперь я хотел бы создать "псевдоним" для каждого каталога и каждого файла имени, чтобы я мог ссылаться на них. "Псевдокод" может быть таким:

% 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

Мой первый подход заключался в использовании \newcommand, но это вызвало множество проблем из-за ограничений именования. (Я также пробовал другие методы, такие как pgfkeys, но он всегда где-то застревает!)

Можете ли вы предложить метод?

решение1

Для более гибких имен псевдонимов вы можете сделать это так. В примерах я удалил подчеркивание; в зависимости от предполагаемого использования вы можете захотеть экранировать их ( \_) или нет ( _).

\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}

Как предположил @MaestroGlanz, команды \aliasи \Aможно определить более компактно с помощью пакета etoolbox:

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

Поскольку в исходном вопросе упоминалось, вот pgfkeysрешение (хотя я не знаю о каких-либо преимуществах):

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

Результат образца документа во всех версиях:

введите описание изображения здесь

решение2

Вы можете просто использовать \newcommand, при условии, что имена команд подчиняются правилам tex (по сути состоят из букв).

% 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

решение3

Спасибо за ваши ответы... они были весьма полезны... и заставили меня пойти немного дальше.

Во-первых, изначальный вопрос не настолько ясен, как следовало бы, поэтому более «реальный» пример должен помочь:

В документе LaTeX мне нужно «включить» части внешних файлов (обычно исходный код программного обеспечения). Исходные файлы необходимо скопировать во временное местоположение и (важно) получить временное имя (что-то вроде temp1.tmp, temp2.tmp... и т. д.). [Примечание: способ копирования не важен... просто нужно отслеживать пути и имена файлов.]

Итак, ниже у меня есть решение, которое я использую. Просто делюсь...

\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}

Связанный контент