不同TeXLive版本兼容求助:conf.py中LaTeX代码适配方案
兼容TeXLive2017和2018的解决方案
这个问题的核心原因很清晰:TeXLive2018及后续版本的LaTeX内核已经原生支持\counterwithin和\counterwithout命令,不再需要依赖chngcntr包;而TeXLive2017及更早版本的内核还没有这些命令,必须通过chngcntr包来引入。直接固定加载包或者删除包都会导致其中一个版本报错。
解决思路是通过LaTeX的条件判断,动态决定是否加载chngcntr包,具体修改你的conf.py中的latex_elements配置如下:
latex_elements = { 'preamble': ''' \makeatletter \@ifundefined{counterwithin}{ \usepackage{chngcntr} }{} \makeatother \counterwithin{figure}{chapter} \counterwithin{table}{chapter} ''', }
代码细节说明:
\makeatletter和\makeatother:用来临时允许LaTeX识别以@开头的内部命令(比如\@ifundefined),执行完判断逻辑后再恢复默认规则。\@ifundefined{counterwithin}{...}{...}:检查counterwithin命令是否未定义——如果未定义(对应TeXLive2017),就加载chngcntr包;如果命令已存在(对应TeXLive2018+),则跳过加载操作。- 后续的
\counterwithin命令在两个版本中都能正常工作:2017版本靠chngcntr包提供实现,2018+版本直接调用内核原生命令。
这样修改后,你的配置就能同时兼容两个TeXLive版本,不会再出现重复定义或未定义的编译错误。
内容的提问来源于stack exchange,提问作者Yan Zhu




