我知道使用它article
来获取章节是愚蠢的,但改进的代码很长并且依赖于此。
在下面的代码中我定义了一个新的宏\Section*
,但我必须从原始参数中删除花括号\section*
。
\documentclass{article}
\let\oldsection\section
\def\Section*\huge CHAPTER #1. \\ #2.{\section*{{\huge #1 $|$} \Large #2 \hfill}}
\begin{document}
\section*{\huge CHAPTER 1. \\ Title}
Some text
\Section*\huge CHAPTER 2. \\ Title.
\end{document}
是否可以重新定义\Section*
(或者甚至\section*
)将其简单地用作\Section*{The text as in the pattern}
?
答案1
如果(这是一个大问题如果)我明白,这可能是一种很好的老办法抓取#{
宏参数
\documentclass{article}
\def\Section*#1#{\SectionA}% fake first argument to ignore spaces after *
\def\SectionA#1{\SectionB#1\relax}
\def\SectionB\huge CHAPTER #1. \\ #2\relax{\section*{{\huge #1 $|$} \Large #2 \hfill}}
\begin{document}
\section*{\huge CHAPTER 1. \\ Title}
Some text
\Section*{\huge CHAPTER 2. \\ Title}
Some other text.
\end{document}
但我同意David 的评论正则表达式搜索/替换可能是一个更好的策略。
答案2
尽管这可能看起来很奇怪,但有时候 TeX 并不是答案。
给定原始文件
\documentclass{article}
\begin{document}
\section*{\huge CHAPTER 1.\\ Introduction}
\addcontentsline{toc}{section}{\numberline{}CHAPTER 1. Introduction}
\setcounter{section}{1}
\section{This is a normal section}
\section*{\huge CHAPTER 2.\\ A title}
\addcontentsline{toc}{section}{\numberline{}CHAPTER 2. A title}
\setcounter{section}{1}
\section{This is a normal section}
\end{document}
不是添加更多奇怪的代码来尝试定制它,而是进行小幅编辑以修复源代码,我将在这里使用 sed,但您可以使用 perl 或您的编辑器或任何其他带有正则表达式替换的东西。
嗯.sed
s/{article}/{report}/
s/\\section.{\\huge CHA.*\\\\ /\\chapter{/g
/\\addcontentsline.*CHAPTER/ d
/\\setcounter{section}{1}/ d
然后运行
sed -f hmm.sed file.tex > file2.tex
生产
\documentclass{report}
\begin{document}
\chapter{Introduction}
\section{This is a normal section}
\chapter{A title}
\section{This is a normal section}
\end{document}
因此,这是一个干净、正常的report
类文档,其中有编号的章节。如果需要,您可以进一步自定义章节的显示,可以直接自定义,也可以使用众多软件包之一自定义。
答案3
这是根据以下建议修改后的建议:大卫的回答。
sed
很棒,但我担心建议的方案不够谨慎。考虑到源代码的状态,你真的相信作者能够确保代码在整个文档中的格式一致吗?也许这是真的,但我认为更安全的做法是——至少当我是作者时——假设代码是错误的。
s/{article}/{report}/
很好。这是搜索精确的字符串并替换它。另一方面,它可能只会替换文档中的一个单词。因此风险很低,但收益也很低。
s/\\section.{\\huge CHA.*\\\\ /\\chapter{/g
我们确定没有类似的东西吗
\section*{\huge CHAPTER 4. Another Thing
作者忘记换行了?或者
\section {\huge CHAPTER 5. \ Yet Another
作者漏掉了第二个反斜杠吗?如果脚本只是找不到那些东西,那还不算太糟。但是
\section*{\huge CHAPTER 4. Another Thing\\And Another
将失去标题的第一部分。
我会尝试更多类似
s/\\section\*{\\huge CHAPTER [0-9][0-9]*\. *\\\\ /\\chapter{/g
更具针对性。
然而,真正激发这个答案的是第三行和第四行。
/\\addcontentsline.*CHAPTER/ d
/\\setcounter{section}{1}/ d
如果如果作者始终如一,这当然就是你想要的。但如果作者前后一致,你可能会在不知不觉中丢弃大量内容。你仍然有原版file1.tex
,但我还是会谨慎行事。
假设文件包含
\section*{\huge CHAPTER 10.\\ Vital}\addcontentsline{toc}{section}{\numberline{}CHAPTER 10. Vital}
\setcounter{section}{10} This is an especially vital part of the text, so it's a shame this will get lost.
到此时,第一点混乱已经消失,所以我们有
\chapter{Vital}\addcontentsline{toc}{section}{\numberline{}CHAPTER 10. Vital}
\setcounter{section}{10} This is an especially vital part of the text, so it's a shame this will get lost.
这些线现在变成
也就是说什么都没有。此外,你可能会有类似
\addcontentsline{toc}{section}{\numberline{}CHAPTER 11.
Crucial}
\setcounter{section}{11}
将成为
Crucial}
并导致文本不平衡。
相反,我建议对这些行进行注释。这样做的缺点是增加了(希望是不必要的)混乱,但您可以轻松删除烦人的行,因为您只需目视检查即可。如果您从不看着它们而感到烦恼,它们就不会造成伤害。另一方面,如果似乎缺少某些东西或您突然遇到奇怪的错误,那么弄清楚发生了什么会更容易。
/\\addcontentsline.*CHAPTER/s/^/%/
/\\setcounter{section}{1}/s/^/%/
共,
s/{article}/{report}/
s/\\section\*{\\huge CHAPTER [0-9][0-9]*\. *\\\\ /\\chapter{/g
/\\addcontentsline.*CHAPTER/s/^/%/
/\\setcounter{section}{1}/s/^/%/
尤其是如果文档很长,我更喜欢这种方式,因为无论我多么小心,我可能sed
在一段时间内都不会意识到删除了太多内容,而且在那个时候,要弄清楚发生了什么并不总是那么容易。但是,如果文档很短,您可以使用 David 的版本,只是diff
为了检查是否有任何不妥之处。
diff file1.tex file2.tex
更多背景信息
diff -Naur file1.tex file2.tex
后一种调用通常用于制作补丁,如果更改单独来看没有意义,那么它会很有帮助。
答案4
让我们看看您在评论中显示的代码(您应该在问题中报告它):
\section*{\huge CHAPTER 1.\\ Introduction}
\addcontentsline{toc}{section}{\numberline{}CHAPTER 1. Introduction}
\setcounter{section}{1}
\section*
您似乎想要修改它以应用不同的格式。我假设除了设置这些“章节”之外没有其他实例。
\documentclass{article}
\NewCommandCopy{\latexsection}{\section}
\RenewDocumentCommand{\section}{sO{#3}m}{%
\IfBooleanTF{#1}{\fakechapter{#3}}{\latexsection[#2]{#3}}%
}
\newcommand{\fakechapter}[1]{\makefakechapter#1\makefakechapter}
\def\makefakechapter #1CHAPTER #2.#3\makefakechapter{%
\makefakechapteraux{#2}#3\makefakechapter
}
\def\makefakechapteraux#1#2\\#3\makefakechapter{%
\latexsection*{{\huge\ignorespaces#1\unskip\ $|$\ }{\Large\ignorespaces #3}}%
}
\begin{document}
\section*{\huge CHAPTER 1.\\ Introduction}
\addcontentsline{toc}{section}{\numberline{}CHAPTER 1. Introduction}
\setcounter{section}{1}
\section{This is a normal section}
\section*{\huge CHAPTER 2.\\ A title}
\addcontentsline{toc}{section}{\numberline{}CHAPTER 2. A title}
\setcounter{section}{1}
\section{This is a normal section}
\end{document}
当然,您想推翻将计数器设置为 1 的愚蠢决定section
,也许还想修改目录中的内容。
\documentclass{article}
\NewCommandCopy{\latexsection}{\section}
\RenewDocumentCommand{\section}{sO{#3}m}{%
\IfBooleanTF{#1}{\fakechapter{#3}}{\latexsection[#2]{#3}}%
}
\newcommand{\fakechapter}[1]{\makefakechapter#1\makefakechapter}
\def\makefakechapter #1CHAPTER #2.#3\makefakechapter{%
\makefakechapteraux{#2}#3\makefakechapter
}
\def\makefakechapteraux#1#2\\#3\makefakechapter{%
\latexsection*{{\huge\ignorespaces#1\unskip\ $|$\ }{\Large\ignorespaces #3}}%
\addcontentsline{toc}{section}{\protect\numberline{}CHAPTER #1. #3}%
\removesillyparts
}
\long\def\removesillyparts#1\setcounter{\removesillypartsaux}
\def\removesillypartsaux#1#2{\setcounter{#1}{0}}
\begin{document}
\section*{\huge CHAPTER 1.\\ Introduction}
\addcontentsline{toc}{section}{\numberline{}CHAPTER 1. Introduction}
\setcounter{section}{1}
\section{This is a normal section}
\section*{\huge CHAPTER 2.\\ A title}
\addcontentsline{toc}{section}{\numberline{}CHAPTER 2. A title}
\setcounter{section}{1}
\section{This is a normal section}
\end{document}