Перенос кода LaTeX из Markdown в Eisvogel

Перенос кода LaTeX из Markdown в Eisvogel

У меня есть вопрос по сочетанию LaTeX/Markdown, на который я надеюсь, кто-нибудь сможет мне ответить.

Я использую Markdown для всего, что я пишу, но я также сильно склоняюсь к шаблону Eisvogel. Мне удалось включить несколько очень хороших функциональных модификаций LaTeX в Markdown.

В настоящее время я использую пакет LaTeX awesomebox и иконки FontAwesome5 в моих документах Markdown. Однако я пытаюсь упростить это для многих моих коллег-разработчиков, которые не знают 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
:::

Я также настроил несколько других выносок следующим образом в Eisvogel, используя пакет tcolorbox:

% 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.

решение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.
  • Аргумент or #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 для выделения вопросов жирным шрифтом и отображения флагов как текста с напечатанным шрифтом.

Далее создайте файл обычным способом.

Вот пример вывода:

Скриншот вопросов и ответов

Дополнительный вопрос:

Если кто-то знает еще более простой способ сделать это и удалить еще больше кода LaTeX из Markdown, я был бы признателен. На самом деле, что-то вроде следующего было бы идеально для моих разработчиков:

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

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

Тройное двоеточие и вопросительная переменная будут заменены красным значком вопросительного знака и вертикальной красной полосой справа от него. Аналогично с тройным двоеточием и ответом будет зеленая лампочка.

Таким образом я могу удалить весь код LaTeX из markdown и использовать шаблон pandoc-latex-environment. Я просмотрел синтаксис этого фильтра, но боюсь, что что-то упускаю.

Спасибо.

решение2

Для Вашего следующего вопроса - я сделал небольшой скрипт Lua для pandoc:

--[[
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).

Связанный контент