“renewcommand” 在“usepackages”之前还是之后?

“renewcommand” 在“usepackages”之前还是之后?

[第一次编辑,有很多更改] 我想删除章节的编号,所以我从这里复制了以下内容回答由用户 zwol 提供:

\renewcommand{\thesection}{}
\renewcommand{\thesubsection}{\arabic{section}.\arabic{subsection}}
\makeatletter
\def\@seccntformat#1{\csname #1ignore\expandafter\endcsname\csname the#1\endcsname\quad}
\let\sectionignore\@gobbletwo
\let\latex@numberline\numberline
\def\numberline#1{\if\relax#1\relax\else\latex@numberline{#1}\fi}
\makeatother

我们将上面的代码称为“zwol 代码”。

我有两个 tex 文件,它们具有相同的代码,但 zwol 代码位于不同的位置。在调用包之前,我们将调用包含 zwol 代码的代码“代码 B”。这是代码 B:

\documentclass[11pt, fleqn]{article}

\renewcommand{\thesection}{}
\renewcommand{\thesubsection}{\arabic{section}.\arabic{subsection}}
\makeatletter
\def\@seccntformat#1{\csname #1ignore\expandafter\endcsname\csname the#1\endcsname\quad}
\let\sectionignore\@gobbletwo
\let\latex@numberline\numberline
\def\numberline#1{\if\relax#1\relax\else\latex@numberline{#1}\fi}
\makeatother

\usepackage[vcentering]{geometry}
\geometry{papersize={3.25in,15.5in},total={3in,15in}}

\usepackage[spanish]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{graphicx}
\usepackage[utf8]{inputenc}

\begin{document}

\title{something}
\date{}
\maketitle

\section{mysection} % (fold)
\label{sec1}
lorem ipsum
\\

\end{document}

这是我使用 pdflatex 编译代码 B 后得到的:

使用 pdflatex 的代码 B

这是“代码 A”,即调用包后包含 zwol 代码的代码:

\documentclass[11pt, fleqn]{article}

\usepackage[vcentering]{geometry}
\geometry{papersize={3.25in,15.5in},total={3in,15in}}

\usepackage[spanish]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{graphicx}
\usepackage[utf8]{inputenc}

\renewcommand{\thesection}{}
\renewcommand{\thesubsection}{\arabic{section}.\arabic{subsection}}
\makeatletter
\def\@seccntformat#1{\csname #1ignore\expandafter\endcsname\csname the#1\endcsname\quad}
\let\sectionignore\@gobbletwo
\let\latex@numberline\numberline
\def\numberline#1{\if\relax#1\relax\else\latex@numberline{#1}\fi}
\makeatother

\begin{document}

\title{something}
\date{}
\maketitle

\section{mysection} % (fold)
\label{sec1}
lorem ipsum
\\

\end{document}

使用 pdflatex 编译后:

使用 pdflatex 编写代码 A

当我使用 pdflatex 编译代码 B 时,pdf 在章节标题前显示点:“.mysection”。但是,使用代码 A 时,pdf 按照我的要求显示,显示章节标题前没有任何点:“mysection”。

为什么会发生这种情况?

答案1

是否将\renewcommand包加载放在包加载之前或之后与两个包是否应按某种顺序加载是同一个问题。如果它们定义了不同的命令,则没有区别,但如果它们定义了相同的命令,则根据使用的定义形式,这可能是一个错误,或者第一个或第二个定义可能“获胜”。

在这种情况下,如果你将输入修改为

\show\@seccntformat
\usepackage[spanish]{babel}
\show\@seccntformat

您将在终端和日志文件中看到

> \@seccntformat=macro:
#1->\csname #1ignore\expandafter \endcsname \csname the#1\endcsname \quad .
l.16 \show\@seccntformat

? 
(/usr/local/texlive/2018/texmf-dist/tex/generic/babel/babel.sty
(/usr/local/texlive/2018/texmf-dist/tex/generic/babel/switch.def)
(/usr/local/texlive/2018/texmf-dist/tex/generic/babel-spanish/spanish.ldf
(/usr/local/texlive/2018/texmf-dist/tex/generic/babel/babel.def
(/usr/local/texlive/2018/texmf-dist/tex/generic/babel/txtbabel.def))))
> \@seccntformat=macro:
#1->\csname the#1\endcsname .\quad .
l.18 \show\@seccntformat

? 

所以babelspanish 选项定义这个命令有.1em 的空格。

因此,在第一个版本中,您的定义\@seccntformat不会被使用,因为 babel 在您使用它之前已经重新定义了它。在第二个版本中,首先 babel 重新定义了它,但随后您覆盖了该定义,因此您的定义“获胜”。

相关内容