Sophanatprime / cus

CusTeX
8 stars 4 forks source link

`pgf` 模块更名后编译报错 #7

Closed xkwxdyy closed 1 month ago

xkwxdyy commented 1 month ago

我将 cus.library.pgf.tex 改成 cus.library.pgf_cus.tex,并且把 cus.library.pgf.tex 中的

\CUSProvideLibrary{pgf}{\cus@d@te}{\cus@versi@n}{pgf and tikz support}

改为

\CUSProvideLibrary{pgf_cus}{\cus@d@te}{\cus@versi@n}{pgf and tikz support}

后使用 latex 编译方式编译

\documentclass{book}
\usepackage[library={pgf_cus}]{cus}

\begin{document}

test

\end{document}

出现下面的报错

! Undefined control sequence.
l.2 \usetikzlibrary
                   {spath3}
? 

其它模块文件做上面的改动不会有问题。这个 pgf 模块不改名时也不会出问题。

请问这是什么原因呢?

Sophanatprime commented 1 month ago

由于 pgf 系列宏包不能在 latex3 环境下正确加载,所以 pgf 和 tcb 库采用延迟加载的方式,在使用 \CUSLoadLibrary 时,不会立刻加载它们,而是通过文件钩子,等到加载完 tikz 和 tcolorbox 宏包后才加载。这是由定义在 cus.sty 文件的 \c__cus_library_delayed_prop 控制,它的键为库名,值为宏包名。

xkwxdyy commented 1 month ago

明白了,将 cus.sty 里的

\prop_set_from_keyval:Nn \c__cus_library_delayed_prop 
  { pgf=tikz , tcb=tcolorbox }

改成

\prop_set_from_keyval:Nn \c__cus_library_delayed_prop 
  {
    pgf     = tikz,
    tcb     = tcolorbox,
    pgf_cus = tikz,
    tcb_cus = tcolorbox
  }

就行。

请问除了改 cus.sty 文件源代码,能否通过别的接口来处理呢?我试了一下在 .tex 文件中加入

\ExplSyntaxOn
\prop_gput_from_keyval:Nn \c__cus_library_delayed_prop 
  {
    pgf_cus = tikz,
    tcb_cus = tcolorbox
  }
\ExplSyntaxOff

但好像不起作用,这段设置感觉需要在 cus.sty 里第一次使用 \CUSLoadLibrary 之前加?不知道有没有什么“用户接口”能处理这个需求呢?

xkwxdyy commented 1 month ago

但好像不起作用,这段设置感觉需要在 cus.sty 里第一次使用 \CUSLoadLibrary 之前加?不知道有没有什么“用户接口”能处理这个需求呢?

如果加在 \usepackage{cus} 前肯定会报错,找不到 \c__cus_library_delayed_prop 这个变量。

xkwxdyy commented 1 month ago

我试了一下用 AddToHook\CUSLoadLibrary 加钩子:

\documentclass{book}
\usepackage[library={pgf_cus}]{cus}
\ExplSyntaxOn
\AddToHook{cmd/CUSLoadLibrary/before}
  {
    \prop_set_from_keyval:Nn \c__cus_library_delayed_prop 
      { 
        pgf     = tikz , 
        tcb     = tcolorbox,
        pgf_cus = tikz,
        tcb_cus = tcolorbox
      }
  }
\ExplSyntaxOff

\begin{document}

test

\end{document}

但这样没有效果,我试了一下把 cus.sty\CUSLoadLibrary 的定义 https://github.com/Sophanatprime/cus/blob/814e49c70fbd636cc4173d580b7da3612716c655/cus.sty#L260-L270 改成

\NewDocumentCommand \CUSLoadLibrary { m O{} O{0000/00/00} }
  {
    \prop_set_from_keyval:Nn \c__cus_library_delayed_prop 
      { 
        pgf     = tikz , 
        tcb     = tcolorbox,
        pgf_cus = tikz,
        tcb_cus = tcolorbox
      }
    \prop_if_in:NnTF \c__cus_library_delayed_prop {#1}
      {
        \hook_gput_code:nnn 
          { package/ \prop_item:Nn \c__cus_library_delayed_prop {#1} / after }
          { cus/load }
          { \__cus_load_library_real:nnn {#1} {#2} {#3} }
      }
      { \__cus_load_library_real:nnn {#1} {#2} {#3} }
  }

这样可行,但不知道为什么这样用钩子不行呢?有什么好一点的解决办法吗?

xkwxdyy commented 1 month ago

还试了 RenewDocumentCommand

\documentclass{book}
\usepackage[library={pgf_cus}]{cus}
\ExplSyntaxOn
\RenewDocumentCommand \CUSLoadLibrary { m O{} O{0000/00/00} }
  {
    \prop_set_from_keyval:Nn \c__cus_library_delayed_prop 
      { 
        pgf     = tikz , 
        tcb     = tcolorbox,
        pgf_cus = tikz,
        tcb_cus = tcolorbox
      }
    \prop_if_in:NnTF \c__cus_library_delayed_prop {#1}
      {
        \hook_gput_code:nnn 
          { package/ \prop_item:Nn \c__cus_library_delayed_prop {#1} / after }
          { cus/load }
          { \__cus_load_library_real:nnn {#1} {#2} {#3} }
      }
      { \__cus_load_library_real:nnn {#1} {#2} {#3} }
  }
\ExplSyntaxOff

\begin{document}

test

\end{document}

也不行

Sophanatprime commented 1 month ago

这几种方法都是因为改动太迟了。

现在采用了一种新方法。在需要延迟加载的库最开始加上 \CUSLibraryDelayedUntil{<package>}。这样就能方便配置了。而且在<package> 已经加载完毕的情况下也是有效的。

xkwxdyy commented 1 month ago

这几种方法都是因为改动太迟了。

现在采用了一种新方法。在需要延迟加载的库最开始加上 \CUSLibraryDelayedUntil{<package>}。这样就能方便配置了。而且在<package> 已经加载完毕的情况下也是有效的。

好的,期待您的更新

Sophanatprime commented 1 month ago

这一功能已经在 v0.0.4f 更新了。

xkwxdyy commented 1 month ago

这一功能已经在 v0.0.4f 更新了。

感谢,已经测试,本 issue 解决了