我想使用降价围栏 div 呈现两列 pdf 文档。最小的例子是这样的:
:::::::::::::: {.columns data-latex=""}
::: {.column width="40%" data-latex="[t]{0.4\textwidth}"}
contents...
:::
::: {.column width="60%" data-latex="[t]{0.6\textwidth}"}
contents...
:::
::::::::::::::
html 中的渲染是可以的,但显然有人认为乳胶中的多列渲染仅适用于 beamer,因此它不适用于普通乳胶,然后是 pdf。我无法切换到 pandoc 的 html pdf 引擎,因为我的最终文档需要乳胶模板。
minipage latex 环境似乎很方便实现我想要的。经过大量调查后,我得到了这个 lua 过滤器:
local pandocList = require 'pandoc.List'
Div = function (div)
local options = div.attributes['data-latex']
if options == nil then return nil end
-- if the output format is not latex, the object is left unchanged
if FORMAT ~= 'latex' and FORMAT ~= 'beamer' then
div.attributes['data-latex'] = nil
return div
end
local env = div.classes[1]
-- if the div has no class, the object is left unchanged
if not env then return nil end
local returnedList
-- build the returned list of blocks
if env == 'column' then
local beginEnv = pandocList:new{pandoc.RawBlock('tex', '\\begin' .. '{' .. 'minipage' .. '}' .. options)}
local endEnv = pandocList:new{pandoc.RawBlock('tex', '\\end{' .. 'minipage' .. '}')}
returnedList = beginEnv .. div.content .. endEnv
end
return returnedList
end
不幸的是,生成的乳胶文档 ( pandoc --lua-filter ./latex-div.lua -o test.latex test.md
) 如下,由于第一个 minipage 的结尾和第二个 minipage 的开头之间的空白行,它没有按预期呈现:
\begin{document}
\begin{minipage}[t]{0.4\textwidth}
contents\ldots{}
\end{minipage}
\begin{minipage}[t]{0.6\textwidth}
contents\ldots{}
\end{minipage}
\end{document}
我快到了。如何在不重新处理乳胶文件的情况下摆脱这个不需要的空白行?
事实证明,
\mbox
尽管存在空白行,但使用 Tex 的更简单的解决方案可以使两个 minipages 粘在一起。产生的乳胶代码是:
从那时起,我在git 存储库上发布了一个更全面的过滤器以及其他可能有用的过滤器。
经过进一步调查尝试和错误。我最终能够回答我自己的问题(以防它对某人有用)。
由于嵌套 div 在父 div 之前处理,因此可以重新处理它们以关闭 minipage 环境并在同一个 pandoc.RawBlock 中打开下一个环境(并且显然摆脱了不需要的空行)。
这是新的 lua 过滤器代码:
生成的乳胶文档现在是正确的: