通用预处理器添加额外的空格

Rap*_*ael 5 compiling whitespace markdown

本文之后,我使用GPP为 Markdown 解析器pandoc提供了一些宏。不幸的是,gpp似乎将所有空格复制到结果中。

例如,考虑文件 test.md

% Title
% Raphael
% 2012

\lorem \ipsum
Run Code Online (Sandbox Code Playgroud)

test.gpp

\define{lorem}{Lorem}
\define{ipsum}{ipsum...}
Run Code Online (Sandbox Code Playgroud)

现在,调用gpp -T --include test.gpp test.md收益

<empty line>
% Title
% Raphael
% 2012

Lorem ipsum...
Run Code Online (Sandbox Code Playgroud)

这打破了pandoc. 额外的换行符确实是定义之间的换行符;如果我使用

\define{lorem}{Lorem}@@@
\define{ipsum}{ipsum...}
Run Code Online (Sandbox Code Playgroud)

使用额外选项+c "@@@" "\n",空行消失了。但是这种变通方法不仅丑陋,而且还有两个致命的缺陷。

首先,它也将其视为@@@源文件中的注释指示符。正如@@@Markdown 中没有禁止的那样,当@@@(或任何其他选择的分隔符)发生在源文件中时,这可能会产生意想不到的后果。

其次,由于适当的缩进,它不会覆盖行开头的空格。例如,

\define{lorem}{@@@
  \if{a == a}@@@
    ![some image](test.png)@@@
  \endif@@@
}@@@
Run Code Online (Sandbox Code Playgroud)

将导致所有此类图像标签缩进四个空格,从而pandoc将其排版为代码(如指定)。

因此,如果没有gpp在一行中编写文件或引入丑陋的行尾注释而不是缩进,您可以做些什么来防止gpp在整个地方涂抹多余的空格?

ams*_*ams 2

假设所有垃圾都在包含文件中,因此在文档开始之前,您可以对其进行后处理:

测试.gpp:

\define{lorem}{Lorem}
\define{ipsum}{ipsum...}
----- cut here ------
Run Code Online (Sandbox Code Playgroud)

然后做:

gpp -T --include test.gpp test.md | sed '1,/----- cut here ------/d'
Run Code Online (Sandbox Code Playgroud)

(是否gpp输出到标准输出?否则仅sed在输出文件上运行。)