保存值(如字符串)以供日后使用的最佳方法是什么?

保存值(如字符串)以供日后使用的最佳方法是什么?

我对 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和:\Aetoolbox

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

相关内容