%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B3%D0%BE%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%3F.png)
Я новичок в 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}