![如何在 LaTeX 类中修补 `\LoadClass` 以更改父类而不修改 .cls 文件?](https://linux22.com/image/468453/%E5%A6%82%E4%BD%95%E5%9C%A8%20LaTeX%20%E7%B1%BB%E4%B8%AD%E4%BF%AE%E8%A1%A5%20%60%5CLoadClass%60%20%E4%BB%A5%E6%9B%B4%E6%94%B9%E7%88%B6%E7%B1%BB%E8%80%8C%E4%B8%8D%E4%BF%AE%E6%94%B9%20.cls%20%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我目前正在尝试使用 .dtx 文件为我的大学文档开发一些样式。这样做,我将l3doc
类用作 dtx 文件的文档对应部分中的文档类。但是,我同时使用 KOMA-Script,使用我生成的 sty 文件中的命令并将其用作未来文档的类,并且我想使用为 dtx 文档本身生成的 sty 文件。
由于l3doc
基于article
类,默认情况下不提供 KOMA-Script 特定命令。我目前所做的是获取l3doc dtx 文件,并更改\LoadCLass
要使用的参数scrartcl
。
有没有办法在不改变 cls 文件本身的情况下修补该类?
我尝试使用etoolbox
和\patchcmd
,但没有成功。
\makeatletter
\patchcmd{\LoadClass}
{article}
{scrreprt}
{} ^^A Success code (empty for this example)
{\@latex@error{Patching \string\LoadClass\space failed}}
\makeatother
参考。https://framagit.org/sortion/mus(看这次提交更具体地说,例如)
我也尝试过,\usepackage{scrextend}
但没有成功。
答案1
这种方式无法修补,因为的定义中\LoadClass
没有(仅在内部的使用中)。如果 是 ,则可以使用类名参数的测试重新定义并替换它。但有一种更简单的方法:article
\LoadClass
\LoadClass
l3doc.cls
\LoadClass
scrartcl
koma-script-source-doc.cls
IHMO 您想要的正是通过加载scrartcl
而不是article
使用时完成的ltxdoc
:
\IfFileExists{scrartcl.cls}{%
\declare@file@substitution{article.cls}{scrartcl.cls}
\PassOptionsToClass{fontsize=10pt}{scrartcl}
}{%
\ClassWarningNoLine{koma-script-source-doc}{%
Usually this class should be used with KOMA-Script\MessageBreak
scrartcl. But as that class is not available we use\MessageBreak
standard class article as emergency fallback.\MessageBreak
It is recommended to repeat this LaTeX run after\MessageBreak
build/installation of a complete KOMA-Script%
}%
}
\LoadClassWithOptions{ltxdoc}[2021/12/07]
重要的代码行是:
\declare@file@substitution{article.cls}{scrartcl.cls}
\declare@file@substitution
记录在ltfilehook-doc.pdf
。
另一个建议是加载scrlfile
。它提供了一个命令\ReplaceClass
。这也适用于旧版本的 LaTeX。
请注意:我不知道为什么\usepackage{scrextend}
在您的情况下使用没有成功。我已测试scrextend
在以下情况下加载l3doc
:
\documentclass{l3doc}
\usepackage{scrextend}
\begin{document}
\dictum{Works}
\end{document}
并且成功了。但也许你的意思是,它scrextend
没有提供你想要使用的命令之一。所以下次请更具体一点。