这是使用 luacode 更改文档中 \section 的好方法吗?或者可以使用普通的 Latex 宏来完成吗?

这是使用 luacode 更改文档中 \section 的好方法吗?或者可以使用普通的 Latex 宏来完成吗?

我想做简单的事情。将整个文档中的 每个\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只使用这个产生错误的例子来试图证明为什么我首先想要这样做。

答案1

cprotect它可以工作,因为它隐藏了参数(将其写入文件),并且 hyperref 不再能够处理它。但这也意味着它不再能够出现在大纲/书签中。相反,您只会在那里看到一个文件名:

在此处输入图片描述

因此,一个更好的解决方案——直到找到一种方法来避免这种数学运算带来的超链接错误——是根本不使用书签

 \usepackage[bookmarks=false]{hyperref}

相关内容