我想做简单的事情。将整个文档中的 每个\section
内容更改为。\cprotect\section
我不知道如何使用 latex 宏来实现这一点。所以我用了lua
我想问您是否认为这是一个可行的方法,或者是否有更好的方法,即使用纯乳胶宏来实现,这可能会更有效率。
首先将向 MWE 展示我为什么需要这样做。
如果您想知道为什么不使用编辑器来执行此操作?这是因为我无法编辑 latex 代码本身,\begin{document}
因为我使用的 Latex 编辑器(科学单词)无法理解该命令\protect
。因此,如果我使用 SW 之外的文本编辑器对其进行修改,那么 SW 将无法再读取/理解该文档。
但我只能在序言中做到这一点,因为我可以轻松地向 SW 隐藏序言。
\documentclass[12pt]{article}
\usepackage{unicode-math}
\defaultfontfeatures{Scale=MatchLowercase}
\setmathfont{Asana Math}
\usepackage{Baskervaldx}
\usepackage{amsmath}
\usepackage{hyperref}
\begin{document}
\tableofcontents
\section{$\cos\left( A+B\right) $ and $\sin\left( A+B\right) $}%
this is my section
\end{document}
上面使用lualatex编译时报错
Package hyperref Warning: Token not allowed in a PDF string (Unicode):
(hyperref) removing `math shift' on input line 13.
! Improper alphabetic constant.
<to be read again>
\math@bgroup
l.13 ...+B\right) $ and $\sin\left( A+B\right) $}
%
?
下面的版本使用 lua 来动态修改每一个\section
,\cprotect\section
只需在序言中添加代码而不修改文档的主体,这就是我想要的
\documentclass[12pt]{article}
\usepackage{unicode-math}
\defaultfontfeatures{Scale=MatchLowercase}
\setmathfont{Asana Math}
\usepackage{Baskervaldx}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{cprotect}
\usepackage{luacode,luatexbase}
\AtBeginDocument{%
\luaexec{luatexbase.add_to_callback
( "process_input_buffer", changeSection, "changeSection" )}%
}
\begin{luacode}
function changeSection(s)
--texio.write_nl("Enter with s="..s)
s = string.gsub(s,"\\section" , "\\cprotect\\section")
return (s)
end
\end{luacode}
\begin{document}
\tableofcontents
\section{$\cos\left( A+B\right) $ and $\sin\left( A+B\right) $}%
this is my section
\end{document}
现在 lualatex 可以编译成功并且输出的 PDF 是正确的。
问题是:可以使用直接 Latex 宏完成上述操作吗?我试过了renewcommand
,但没有用。
我对上述内容并不不满,但担心它可能效率低下,因为它每次都必须对整个文档进行大量字符串搜索。我打算对subsection
和做同样的事情subsubsection
。
请注意,我只使用 lualatex。
TL 2020
更新
对于上述错误,我尝试了建议链接中的“修复”,但仍然出现错误:
\documentclass[12pt]{article}
\usepackage{unicode-math}
\defaultfontfeatures{Scale=MatchLowercase}
\setmathfont{Asana Math}
\usepackage{Baskervaldx}
\usepackage{amsmath}
\usepackage[unicode,psdextra]{hyperref}[2012/08/13]
\begin{document}
\tableofcontents
\section{$\cos\left( A+B\right) $ and $\sin\left( A+B\right) $}%
this is my section
\end{document}
使用编译lualatex
! Improper alphabetic constant.
<to be read again>
\math@bgroup
l.13 ...+B\right) $ and $\sin\left( A+B\right) $}
%
?
我这里的问题不是关于上述错误,而是是否有更好的方法来改变\section
我\cprotect\section
只使用这个产生错误的例子来试图证明为什么我首先想要这样做。