如何正确地扩展 \url 或 \path 宏的参数?

如何正确地扩展 \url 或 \path 宏的参数?

在以下 MSE 中:

\documentclass{article}

\usepackage{url}

\newcommand{\rootDir}{\$ROOTDIR}
\newcommand{\myDir}{my/dir}
\newcommand{\makeFilePaths}[3]{%
  \expandafter\newcommand\expandafter{\csname dfile#1\endcsname}{%
    \rootDir/#2/#3%
  }%
  \expandafter\newcommand\expandafter{\csname ifile#1\endcsname}{%
    ../../#2/#3%
  }%
}
\makeFilePaths{test}{\myDir}{a/file/path.txt}
\newcommand{\pathText}[1]{%
  %\edef\temp{path{#1}}% Doesn't compile
  \expandafter\path\expandafter{#1}%
}

\begin{document}
\dfiletest
\pathText{\dfiletest}
\end{document}

我试图从一组宏中生成文件路径,然后使用命令打印结果路径\path(但我认为\url效果同样好)。但是,我似乎无法正确扩展参数,因为上面的代码产生:

$ROOTDIR/my/dir/a/file/path.txt       <- This is what I want
\rootDir/\myDir/a/file/path.txt       <- Should be the same as above

我可能需要使用\edef一些,但我一直收到编译错误。

答案1

只要你的路径不包含特殊字符,你就可以使用

\documentclass{article}

\usepackage{url}

\newcommand{\rootDir}{\string$ROOTDIR}
\newcommand{\myDir}{my/dir}

\makeatletter
\newcommand{\makeFilePaths}[3]{%
  \expandafter\@ifdefinable\csname dfile#1\endcsname{%
    \expandafter\edef\csname dfile#1\endcsname{\rootDir/#2/#3}%
  }%
  \expandafter\@ifdefinable\csname ifile#1\endcsname{%
    \expandafter\edef\csname ifile#1\endcsname{../../#2/#3}%
  }%
}
\makeatother

\makeFilePaths{test}{\myDir}{a/file/path.txt}

\newcommand{\pathText}{%
  \expandafter\path\expandafter
}

\begin{document}

\dfiletest

\pathText{\dfiletest}

\pathText{\ifiletest}

\end{document}

使用\newcommand是不可能的,因为正如您所观察到的,您需要\edef,所以我使用内部测试\@ifdefinable来检查该命令是否仍然可用。

注意\string$以获得美元符号的“可扩展”版本。

在此处输入图片描述

相关内容