我目前正在尝试排版具有特定结构的纯文本文件。有一件事我无法完成,那就是以下内容。我的纯文本结构如下:
"lorem ipsum dolor sit amet." (A block of text.)
Title
"lorem ipsum dolor sit amet." (A block of text.)
因此,我的文档中的每个部分上方都有一个标题(以“/newline”分隔),并且每个部分与其他部分的分隔距离是该标题的两倍。
基本上我想将上述内容转换为:
"lorem ipsum dolor sit amet." (A block of text.)
\section{Title}
"lorem ipsum dolor sit amet." (A block of text.)
可以做这样的事吗?
答案1
虽然直接在 (La)TeX 中执行此类转换当然是可能的(而且可能也很有趣),但我只会使用perl
或类似的支持跨多行搜索和替换的工具。对于你的情况:
perl -0777 -i.bak -pe 's/\n\n\n(.*)\n\n/\n\n\\section{\1}\n/' plain.txt
将相应地转换文件text.txt
。
一些细节:
该
-0777
选项使perl
文件立即被读取,这对于跨多行匹配是必要的。该文件
plain.txt
将被“就地”修改(-i
选项),但会在 中创建一个备份plain.bak
(提供给 的后缀-i
)。在正则表达式中,我们搜索三个连续的换行符,
\n\n\n
后跟以(.*)
两个换行符终止的任意文本\n\n
。在替换部分,我们插入两个换行符
\n\n
,后跟\section{...}
命令和另一个换行符\n
。\1
用搜索正则表达式的第一个括号表达式替换,在本例中是匹配的“任意文本”。
答案2
如果我理解你的问题,你需要将每个段落(由空行分隔)解释为章节标题,前提是这些段落前面正好有两个空行。你可以试试这个:
\def\par{\endgraf\futurelet\next\parA}
\def\parA{\ifx\next\par \expandafter\sect\fi}
\long\def\sect#1#2\par{\bigskip{\bf #2}\par\nobreak\medskip}
block of text
section title
first paragraph block of text block of text block of text
second paragraph block of text block of text block of text
sect2 title
next paragraph block of text block of text block of text
\bye
但是这段代码非常脆弱。\bye
例如,您可以尝试在之前插入两个空行,但会出错。如果在宏之间插入空行,那么如果有两个连续的空行,您就会遇到新的问题。
答案3
使用 Notepad++,使用扩展搜索模式并查找三个返回到您输入的行(两个空行)
\r\n\r\n\r\n
将其替换为
\r\n\r\n\r\n\section{
通过了解 \r\n\r\n" 后面的内容来关闭 \section 命令。替换
\r\n\r\n"
经过
}\r\n"
然后你将会转变
"lorem ipsum dolor sit amet." (A block of text.)
Title
"lorem ipsum dolor sit amet." (A block of text.)
到:
"lorem ipsum dolor sit amet." (A block of text.)
\section{Title}
"lorem ipsum dolor sit amet." (A block of text.)