从文档类内部获取类文件的相对路径

从文档类内部获取类文件的相对路径

是否可以获取调用中使用的相对路径,\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}

在我的系统上它打印:

在此处输入图片描述

相关内容