宏定义中的 `{`?

宏定义中的 `{`?

我知道使用它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}

在此处输入图片描述

相关内容