我有一个关于 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
)。