是否可以获取调用中使用的相对路径,\documentclass
以便我可以\input
在文档类中使用来导入相对于该.cls
文件的文件?
文件夹结构示例:
./cls/class.cls
./cls/otherfiles/otherfile.tex
./document/document.tex
我用来\documentclass{../cls/class}
导入我的课程。
我想使用\input{otherfiles/otherfile}
它来class.cls
轻松分离一些代码块以提高可读性。
但是,将 包含进 中./document/document.tex
会导致LaTeX Error: File otherfiles/otherfile.tex` not found.
。
答案1
这是一个宏,用于从对类或包文件的调用中提取路径。如果您的类文件是test.cls
,如果您调用\getrelativepath\thispath{test.cls}
,则宏\thispath
将包含中使用的相对路径\documentclass
。如果没有使用相对路径,则宏将为空,因此您可以安全地使用。此命令仅在或文件\input{\thispath otherfile.tex}
中使用时才有效,因为它依赖于 LaTeX 的文件处理代码。如果您在文档中使用它,您将收到错误。.cls
.sty
这是代码。我将其放在filecontents
环境中以使其成为一个工作示例。第二个块是定义的主要部分,第三个块是示例用法:
\begin{filecontents*}{test.cls}
\LoadClass{article}
\RequirePackage{expl3}
\ExplSyntaxOn
\str_new:N \l__carsten_tmpa_str
\cs_new_protected:Npn \__carsten_tmp:w { }
\cs_new_protected:Npn \getrelativepath #1 #2
{
\str_set:Nx \l__carsten_tmpa_str { \@currname.\@currext }
\exp_args:NV \str_if_in:NnTF \l__carsten_tmpa_str {#2}
{
\str_if_eq:VnTF \l__carsten_tmpa_str {#2}
{ \tl_set:Nn #1 { } }
{ \exp_args:Nx \__carsten_parse_path:nN { \tl_to_str:n {#2} } #1 }
}
{ \msg_error:nnxx { carsten } { wrong-path } {#2} { \l__carsten_tmpa_str } }
}
\cs_new_protected:Npn \__carsten_parse_path:nN #1 #2
{
\cs_set_protected:Npn \__carsten_tmp:w ##1 #1 \q_mark ##2 ##3 \q_stop
{
\quark_if_nil:nTF {##2}
{ \tl_set:Nn #2 {##1} }
{ \msg_error:nn { carsten } { unexpected-error } }
}
\use:x
{
\__carsten_tmp:w
\exp_not:V \l__carsten_tmpa_str \exp_not:n { \q_mark \q_nil }
\tl_to_str:n {#1} \exp_not:n { \q_mark \q_mark }
\exp_not:N \q_stop
}
}
\msg_new:nnn { carsten } { wrong-path }
{ Unexpected~path~error.~'#1'~not~found~in~'#2'. }
\msg_new:nnn { carsten } { unexpected-error }
{ This~should~not~happen. }
\ExplSyntaxOff
\getrelativepath\thispath{test.cls}
\end{filecontents*}
\documentclass{../tex.sx/test}
\begin{document}
\texttt{\thispath}
\end{document}
在我的系统上它打印: