在以下 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$
以获得美元符号的“可扩展”版本。