重新定义宏与 titlesec 包冲突。如何避免?

重新定义宏与 titlesec 包冲突。如何避免?

在我的问题中这里如何正确地添加到宏而不将原始宏存储在 tmp 变量中,我被告知我的代码实际上可以工作。但是,它以某种方式与 titlesec 包冲突。

我怎样才能更改我的代码以便正确地与 titlesec 包一起工作,同时仍然不为原始宏定义 tmp 变量?

\documentclass{article}

\usepackage{titlesec}

\def\abc{abc}
\begingroup\let\orgabc\abc\def\abc{\orgabc\endgroup def}

\begin{document}
  \section{One}
  \abc

  \section{Two}
  Two

\end{document}

注释掉后工作正常\usepackage{titlesec}

答案1

\def\abc{abc}
\begingroup\let\orgabc\abc\def\abc{\orgabc\endgroup def}

\begin{document}
  \section{One}
  \abc

这将放置在以 开始并以 结束的\begin{document}组内。\begingroup\abc

除此以外的任何环境document都会产生错误。由于技术原因,它不会在此处生成错误消息,但它会完全破坏所有 latex 处理,因为通常发生的所有设置\begin{document}\abc

根据你的意图

\def\abc{abc}
\let\orgabc\abc
\def\abc{\orgabc def}

\begin{document}
  \section{One}
  \abc

或者

\def\abc{abc}
\expandafter\def\expandafter\abc\expandafter{\abc def}

\begin{document}
  \section{One}
  \abc

或者

\makeatletter
\def\abc{abc}
\g@addto@macro\abc{def}
\makeatother

\begin{document}
  \section{One}
  \abc

答案2

实际上你的代码相当于

\documentclass{article}
\usepackage{titlesec}

\begingroup
\begin{document}
\section{One}
\endgroup

\section{Two}
  Two

\end{document}

但是在代码中titlesec使用\AtBeginDocument{...\let\ttl@Hy@refstepcounter\refstepcounter...} 之后,\endgroup即之后不再定义。\abc\ttl@Hy@refstepcounter

相关内容