Migrando código LaTeX de Markdown a Eisvogel

Migrando código LaTeX de Markdown a Eisvogel

Tengo una pregunta combinada de LaTeX/Markdown y espero que alguien pueda responder.

Estoy usando Markdown para todos mis escritos, pero también me inclino mucho por la plantilla Eisvogel. He podido habilitar varias modificaciones funcionales de LaTeX muy interesantes en Markdown.

Actualmente, estoy usando el paquete LaTeX awesomebox y los íconos FontAwesome5 en mis documentos Markdown. Sin embargo, estoy tratando de hacer esto más fácil para muchos de mis compañeros desarrolladores que no conocen LaTeX.

Actualmente, hago lo siguiente en Markdown para mostrar bloques personalizados de preguntas y respuestas:

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

Hice lo siguiente en la plantilla de Eisvogel para asegurarme de que esto funcione:

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

Mi archivo Markdown genera los íconos y los bloques de administración de la forma que quiero; un signo de interrogación rojo para la pregunta y una bombilla verde para la respuesta, seguido del texto necesario.

Sin embargo, esto es demasiado complicado para algunos de los desarrolladores que prefieren solo Markdown. Están dispuestos a utilizar la siguiente convención para mostrar el código:

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

También personalicé varios otros cuadros de llamadas de la siguiente manera en Eisvogel usando el paquete 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:}}

Mi pregunta es:

¿Es posible portar todo el script \awesomebox[blah] a la plantilla Eisvogel? ¿Pueden mis usuarios usar la convención de tres puntos o algo similar para usar íconos personalizados en su Markdown básico?

Quiero que sea más fácil para los usuarios agregar sus preguntas y respuestas sin tener que aprender más LaTeX.

¿Algunas ideas? Gracias de antemano. Me complace proporcionar ejemplos de personalizaciones de mi plantilla personalizada de Eisvogel.

Respuesta1

Resolví mi problema.

Como mencioné en mi publicación original, quería personalizar el código Markdown para limitar la cantidad de código LaTeX que aparece. Esto es lo que hice para resolver esto:

Dentro de la plantilla Eisvogel ( eisvogel.tex), agregue las siguientes líneas en algún lugar del código. Agregué mis líneas alrededor de la línea 690.

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

Básicamente, sacamos el código de Markdown y lo colocamos en Eisvogel. Creamos dos nuevos comandos y los llamamos \questiony \answer. Tenga en cuenta la barra diagonal anterior.

Así es como los usaremos en Markdown. Creamos el nuevo comando usando las siguientes definiciones:

\newcommand{cmd}[args]{def}
\renewcommand{cmd}[args]{def}
  • El nombre del comando es \questiono \answer.
  • Solo hay un argumento, o [1], que funciona como entrada del usuario.
  • La definición es la cadena de código LaTeX.
  • El argumento o #1se agrega al final y actúa como entrada del usuario en el archivo Markdown.

Luego, pasando al archivo Markdown, formule sus preguntas y respuestas de la siguiente manera:

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

Tenga en cuenta el uso de etiquetas LaTeX para poner las preguntas en negrita y las banderas en tipo verdadero.

A continuación, cree el archivo como lo haría normalmente.

A continuación se muestra un ejemplo del resultado:

Captura de pantalla de preguntas y respuestas

Siguiente pregunta:

Si alguien conoce una forma aún más sencilla de hacer esto y eliminar aún más código LaTeX de Markdown, se lo agradecería. De hecho, algo como lo siguiente sería perfecto para mis desarrolladores:

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

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

Los dos puntos triples y la variable de pregunta serían reemplazados por el ícono del signo de interrogación rojo y la barra roja vertical a su derecha. Lo mismo ocurre con los dos puntos y la respuesta sería la bombilla verde.

De esta manera puedo eliminar todo el código LaTeX de Markdown y usar la plantilla pandoc-latex-environment. He revisado la sintaxis de este filtro pero temo que me falta algo.

Gracias.

Respuesta2

Para su pregunta de seguimiento: he creado un pequeño 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

Puede definir sus propios tipos agregándolos a la lista de advertencias en el script y definiéndolos en la header-includessección (consulte el ejemplo para question).

información relacionada