Migrando código LaTeX de Markdown para Eisvogel

Migrando código LaTeX de Markdown para Eisvogel

Eu tenho uma pergunta combinada sobre LaTeX/Markdown esperando que alguém possa responder.

Estou usando Markdown para todos os meus escritos, mas também estou me apoiando fortemente no modelo Eisvogel. Consegui ativar várias modificações funcionais muito interessantes do LaTeX no Markdown.

Atualmente, estou usando o pacote LaTeX awesomebox e os ícones FontAwesome5 em meus documentos Markdown. No entanto, estou tentando tornar isso mais fácil para muitos dos meus colegas desenvolvedores que não conhecem LaTeX.

Atualmente, faço o seguinte no Markdown para mostrar blocos personalizados de perguntas e respostas:

\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.}

Fiz o seguinte no modelo Eisvogel para ter certeza de que funcionaria:

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

Meu arquivo Markdown gera os ícones e blocos de administração do jeito que eu quero; um ponto de interrogação vermelho para a pergunta e uma lâmpada verde para a resposta, seguido do texto necessário.

No entanto, isso é muito complicado para alguns desenvolvedores que preferem apenas Markdown. Eles estão dispostos a usar a seguinte convenção para mostrar o código:

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

Também personalizei várias outras caixas de texto explicativo da seguinte maneira no Eisvogel usando o pacote 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:}}

Minha pergunta é:

É possível portar todo o script \awesomebox[blah] para o modelo Eisvogel? Meus usuários podem usar a convenção de dois pontos triplos ou algo semelhante para usar ícones personalizados em seu Markdown básico?

Quero tornar mais fácil para os usuários adicionarem suas perguntas e respostas sem precisar aprender mais sobre LaTeX.

Alguma ideia? Desde já, obrigado. Fico feliz em fornecer exemplos de customizações do meu modelo personalizado do Eisvogel.

Responder1

Eu resolvi meu problema.

Como mencionei na minha postagem original, eu queria personalizar o código Markdown para limitar a quantidade de código LaTeX que aparece. Aqui está o que fiz para resolver isso:

Dentro do modelo Eisvogel ( eisvogel.tex), adicione as seguintes linhas em algum lugar do código. Eu adicionei minhas linhas em torno da linha 690.

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

Basicamente, retiramos o código do Markdown e o colocamos no Eisvogel. Criamos dois novos comandos e os chamamos de \questione \answer. Observe a barra anterior.

É assim que os usaremos no Markdown. Criamos o novo comando usando as seguintes definições:

\newcommand{cmd}[args]{def}
\renewcommand{cmd}[args]{def}
  • O nome do comando é \questionou \answer.
  • Existe apenas um único argumento, ou [1], que funciona como uma entrada do usuário.
  • A definição é a string do código LaTeX.
  • O argumento or #1é adicionado ao final e atua como entrada do usuário no arquivo Markdown.

A seguir, passando para o arquivo Markdown, formule suas perguntas e respostas da seguinte maneira:

\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.}

Observe o uso de tags LaTeX para deixar as perguntas em negrito e os sinalizadores em tipo verdadeiro.

Em seguida, crie o arquivo normalmente.

Aqui está um exemplo da saída:

Captura de tela de perguntas e respostas

Questão a seguir:

Se alguém souber uma maneira ainda mais fácil de fazer isso e remover ainda mais código LaTeX do Markdown, eu agradeceria. Na verdade, algo como o seguinte seria perfeito para meus desenvolvedores:

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

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

Os dois pontos triplos e a variável de pergunta seriam substituídos pelo ícone de ponto de interrogação vermelho e pela barra vertical vermelha à sua direita. Da mesma forma com os dois pontos triplos e a resposta seria a lâmpada verde.

Dessa forma, posso remover todo o código LaTeX do markdown e usar o modelo pandoc-latex-environment. Examinei a sintaxe desse filtro, mas temo que esteja faltando alguma coisa.

Obrigado.

Responder2

Para sua pergunta complementar - criei um pequeno script Lua para 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

Você pode definir seus próprios tipos adicionando-os à lista de advertências no script e definindo-os na header-includesseção (veja o exemplo para question).

informação relacionada