将 LaTeX 代码从 Markdown 迁移到 Eisvogel

将 LaTeX 代码从 Markdown 迁移到 Eisvogel

我有一个关于 LaTeX/Markdown 组合的问题,希望有人能回答。

我所有的写作都使用 Markdown,但我也非常依赖 Eisvogel 模板。我已经能够在 Markdown 中启用几个非常好用的 LaTeX 修改功能。

目前,我在 Markdown 文档中使用 LaTeX awesomebox 包和 FontAwesome5 图标。不过,我正在尝试让许多不懂 LaTeX 的开发人员同事更容易地使用。

目前,我在 Markdown 中执行以下操作来显示自定义问答块:

\awesomebox[maroon]{2pt}{\faQuestionCircle}{maroon}{\textbf{Question:} How do you do the thing?}

\awesomebox[brandgreen]{2pt}{\faLightbulb}{brandgreen}{\textbf{Answer:} You do the thing this way.}

我在 Eisvogel 模板中做了以下操作以确保其有效:

% Enable awesomebox and fontawesome5 icons for callouts
\usepackage{awesomebox}
\usepackage{fontawesome5}
\usepackage{verbatim}

我的 Markdown 文件按照我想要的方式生成图标和管理块;红色问号表示问题,绿色灯泡表示答案,后面跟着必要的文本。

然而,对于一些只喜欢 Markdown 的开发人员来说,这太复杂了。他们愿意使用以下约定来展示代码:

::: code
This is a block of code
:::

我还使用 tcolorbox 包在 Eisvogel 中以以下方式自定义了其他几个标注框:

% tcolorbox
\usepackage{tcolorbox}
\newtcolorbox{norm-box}{colback=gray!5!white,arc=0pt,outer arc=0pt,colframe=gray!60!black}
\newtcolorbox{info-box}{colback=cyan!5!white,arc=0pt,outer arc=0pt,colframe=cyan!60!black}
\newtcolorbox{warn-box}{colback=orange!5!white,arc=0pt,outer arc=0pt,colframe=orange!80!black}
\newtcolorbox{error-box}{colback=red!5!white,arc=0pt,outer arc=0pt,colframe=red!75!black}
\newtcolorbox{attn-box}{colback=green!5!white,arc=0pt,outer arc=0pt,colframe=green!75!black}
\newtcolorbox{code-box}{colback=codeblock!100!white,arc=0pt,outer arc=0pt,colframe=gray!0!white}
\newtcolorbox{learn-box}{colback=blue!5!white,arc=0pt,outer arc=0pt,colframe=blue!40!black,title=\textbf{Objectives:}}
\newtcolorbox{scenario-box}{colback=orange!5!white,arc=0pt,outer arc=0pt,colframe=orange!80!black,title=\textbf{Scenario:}}
\newtcolorbox{outline-box}{colback=cyan!5!white,arc=0pt,outer arc=0pt,colframe=cyan!60!black,title=\textbf{Outline:}}
\newtcolorbox{prereqs-box}{colback=red!5!white,arc=0pt,outer arc=0pt,colframe=red!60!black,title=\textbf{Prerequisites:}}
\newtcolorbox{labtime-box}{colback=yellow!5!white,arc=0pt,outer arc=0pt,colframe=yellow!60!black,title=\textbf{Lab:}}

我的问题是:

是否可以将整个 \awesomebox[blah] 脚本移植到 Eisvogel 模板中?我的用户可以使用三重冒号约定或类似的东西在基本 Markdown 中使用自定义图标吗?

我想让用户更轻松地添加他们的问题和答案,而无需学习更多 LaTeX。

有什么想法吗?提前致谢。很高兴提供我的自定义 Eisvogel 模板的示例 cvustomizations。

答案1

我解决了我的问题。

就像我在原帖中提到的那样,我想自定义 Markdown 代码以限制出现的 LaTeX 代码数量。以下是我为解决这个问题所做的事情:

在 Eisvogel 模板 ( eisvogel.tex) 中,在代码中的某处添加以下几行。我在第 690 行左右添加了这些行。

%% Testing newcommands, question and answers
\newcommand{\question}[1]{\awesomebox[maroon]{2pt}{\faQuestionCircle}{maroon}{#1}}
\newcommand{\answer}[1]{\awesomebox[brandgreen]{2pt}{\faLightbulb}{brandgreen}{#1}}

基本上,我们将代码从 Markdown 移出并放在 Eisvogel 中。我们创建了两个新命令,并将它们命名为\question\answer。请注意前面的斜杠。

这就是我们在 Markdown 中使用它们的方式。我们使用以下定义创建新命令:

\newcommand{cmd}[args]{def}
\renewcommand{cmd}[args]{def}
  • 命令名称是\question\answer
  • 只有一个参数,或[1],其工作方式类似于来自用户的输入。
  • 该定义是 LaTeX 代码的字符串。
  • 参数或被#1添加到末尾,作为 Markdown 文件中来自用户的输入。

接下来,转到 Markdown 文件,按以下方式制定您的问题和答案:

\question{\textbf{Question:} What flags in the output state what virtualization support is
available on this server?}

\answer{\textbf{Answer:} Multiple flags show up: \texttt{Virtualization: VT-x}, \texttt{Hypervisor
vendor: KVM}, and \texttt{Virtualization type: full}. These flags provide information about the
type of virtualization support available on this server.}

请注意使用 LaTeX 标签使问题变为粗体,并将标志变为真实类型。

接下来,像平常一样构建文件。

以下是输出示例:

问答截图

后续问题:

如果有人知道更简单的方法来实现这一点并从 Markdown 中删除更多 LaTeX 代码,我将不胜感激。事实上,对于我的开发人员来说,下面这样的方法就再合适不过了:

::: question
Question: What color is the sky?
:::

::: answer
Answer: The sky is blue.
:::

三重冒号和问题变量将被红色问号图标及其右侧的垂直红条替换。同样,三重冒号和答案将是绿色灯泡。

这样我就可以从 markdown 中删除所有 LaTeX 代码并使用 pandoc-latex-environment 模板。我查看了这个过滤器的语法,但担心我遗漏了一些东西。

谢谢。

答案2

对于您的后续问题 - 我为 pandoc 制作了一个小型 Lua 脚本:

--[[
admonition boxes, e.g:

::: warning
:::

awesomebox package supports 'note', 'tip', 'warning', 'caution', 'important'
other custom types have to be defined in header-includes (see below)

header-includes:
    # enable parsing markdown in custom environment:
    # (e.g. use \Begin{admonition} ... \End{admonition})
    # --------------------------------------------------------------------------
    - \let\Begin\begin
    - \let\End\end
    #
    # custom environment for admonition boxes:
    # --------------------------------------------------------------------------
    - \usepackage{awesomebox}
    #
    - \newenvironment{questionblock}
        {\begin{awesomeblock}[orange]{2pt}{\faQuestionCircle}{orange}}
        {\end{awesomeblock}}
]]

local admonitions = pandoc.List:new {'note', 'tip', 'warning', 'caution', 'important', 'question'}

function Div(elem)
  local adm = elem.classes[1]

  if admonitions:includes(adm) then
    return {
      pandoc.RawBlock("latex", "\\Begin{" .. adm .. "block}"),
      elem,
      -- \setlength{\parskip}{-1em} to gobble the extra newline before End
      pandoc.RawBlock("latex", "\\setlength{\\parskip}{-1em}\n\\End{" .. adm .. "block}")
    }
  end
end

您可以通过将自己的类型添加到脚本中的警告列表并在header-includes部分中定义它们来定义自己的类型(请参阅示例question)。

相关内容