我对 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}