¿Cómo mostrar un nombre de archivo encima de un fragmento de código como en Arch Wiki?

¿Cómo mostrar un nombre de archivo encima de un fragmento de código como en Arch Wiki?

Contexto

Estoy escribiendo un documento similar a un tutorial en LaTeX sobre cómo crear un determinado dispositivo basado en Linux. Parte del esfuerzo de recrear el dispositivo consiste en escribir pequeños fragmentos de código, ya sea en Bash o Python, y editar archivos de configuración.

Todo esto debe incluirse en el documento. Para poder recrearlo, por supuesto, se debe conocer el nombre del archivo y su contenido. Me gusta la forma en que los chicos del arco lo hacen en suswiki, limpio y sencillo:

Fragmento de [arco wiki][1]

Por ejemplo, "/etc/systemd/system/unit.d/customexec.conf" es el nombre del archivo, mientras que las tres líneas siguientes son el texto real del archivo.

Finalmente, quiero que la sintaxis del código esté resaltada. yo sueloacuñadopara eso. También valoro tener números de línea. Hace que hacer referencia a ellos sea mucho más fácil.

lo que tengo ahora

He jugado con varios ejemplos que encontré en Internet y la documentación acuñada. Aunque todavía no me gusta lo que tengo. Aquí hay un MWE:

\documentclass{report}

\usepackage[table,usenames,dvipsnames,hyperref]{xcolor}
\usepackage{listings}
\usepackage{caption}

\DeclareCaptionStyle{mystyle}%
[margin=2mm,justification=raggedright]%
{font=footnotesize,labelfont=sc,margin={100mm,10mm}}

\DeclareCaptionFormat{continued}{File#2#3}

\captionsetup{style=mystyle, indention=10cm, format=continued}

\usepackage[newfloat]{minted}
\SetupFloatingEnvironment{listing}{name=File}

\definecolor{mintedbackground}{rgb}{0.95,0.95,0.95}

% This is the bash profile used throughout the document.
% I've also got one for Python and console text (regular commands)
\newminted[bashcode]{bash}{
    bgcolor=mintedbackground,
    fontfamily=tt,
    linenos=true,
    numberblanklines=true,
    numbersep=12pt,
    numbersep=5pt,
    gobble=0,
    frame=leftline,
    framesep=2mm,
    funcnamehighlighting=true,
    tabsize=4,
    obeytabs=false,
    mathescape=false
    samepage=false,
    showspaces=false,
    showtabs =false,
    texcl=false,
    baselinestretch=1.2,
    fontsize=\footnotesize,
    breaklines=true,
}

\begin{document}

\begin{listing}[H]
\caption{/files/location/on/system.sh}
\begin{bashcode}
#!/bin/bash
echo "I am a bash file"
\end{bashcode}
\end{listing}

\end{document}

Genera lo siguiente (recorte de la salida original):

Resultado del MWE anterior

Como puede ver en MWE, estoy haciendo un mal uso del título como nombre de archivo. No me gusta esto en general, pero supongo que hacer que el título forme parte del fondo de Minted también está fuera de discusión, ya que el título está fuera del alcance de la sección Minted.

Nota:el MWE requiere minted 2. Mi distribución (Kubuntu 14.04) viene con una versión anterior. Descargué el archivo .sty aquí: https://raw.githubusercontent.com/gpoore/minted/master/source/minted.sty (lo siento, no tengo suficientes puntos para incluir más de dos enlaces).

La pregunta

En pocas palabras, ¿cómo puedo acercarme al ejemplo de Arch Wiki?

Estoy bien con una solución que no utiliza minted. La solución tampoco tiene por qué ser agradable a la vista. Ahora estoy pensando en crear dichos fragmentos en un archivo HTML externo y luego incluirlos. Todo está bien para mí siempre y cuando siga siendo viable. El documento estará terminado en unas pocas semanas y no necesito seguir trabajando en él, por lo que tener todo automatizado e integrado no es muy importante.

¡Gracias de antemano! Por favor, avíseme si no incluí alguna información.

Respuesta1

Puede utilizar tcolorboxel paquete para configurar sus listados. Puede funcionar con minted. Lo siguiente sería la salida más o menos predeterminada, personalizada según su mintedestilo.

\documentclass{report}

\usepackage[skins,minted]{tcolorbox}

\definecolor{mintedbackground}{rgb}{0.95,0.95,0.95}

% This is the bash profile used throughout the document.
% I've also got one for Python and console text (regular commands)
\setminted[bash]{
    bgcolor=mintedbackground,
    fontfamily=tt,
    linenos=true,
    numberblanklines=true,
    numbersep=12pt,
    numbersep=5pt,
    gobble=0,
    frame=leftline,
    framesep=2mm,
    funcnamehighlighting=true,
    tabsize=4,
    obeytabs=false,
    mathescape=false
    samepage=false,
    showspaces=false,
    showtabs =false,
    texcl=false,
    baselinestretch=1.2,
    fontsize=\footnotesize,
    breaklines=true,
}

\newtcblisting{myminted}[2][]{listing engine=minted, listing only,#1, title=#2, minted language=bash, colback=mintedbackground}
\begin{document}

\begin{myminted}{/files/location/on/system.sh}
#!/bin/bash
echo "I am a bash file"
\end{myminted}

\end{document}

ingrese la descripción de la imagen aquí

Faltan algunos ajustes de color y tamaño, pero el resultado es más similar al cuadro propuesto por OP

ingrese la descripción de la imagen aquí

\documentclass{report}

\usepackage[skins,minted]{tcolorbox}

\definecolor{mintedbackground}{rgb}{0.95,0.95,0.95}
\definecolor{mintedframe}{rgb}{0.70,0.85,0.95}

% This is the bash profile used throughout the document.
% I've also got one for Python and console text (regular commands)
\setminted[bash]{
    bgcolor=mintedbackground,
    fontfamily=tt,
    linenos=true,
    numberblanklines=true,
    numbersep=12pt,
    numbersep=5pt,
    gobble=0,
    frame=leftline,
    framesep=2mm,
    funcnamehighlighting=true,
    tabsize=4,
    obeytabs=false,
    mathescape=false
    samepage=false,
    showspaces=false,
    showtabs =false,
    texcl=false,
    baselinestretch=1.2,
    fontsize=\footnotesize,
    breaklines=true,
}

\newtcblisting{myminted}[2][]{enhanced, listing engine=minted, 
listing only,#1, title=#2, minted language=bash, 
coltitle=mintedbackground!30!black, 
fonttitle=\ttfamily\footnotesize,
sharp corners, top=0mm, bottom=0mm,
title code={\path[draw=mintedframe,dashed, fill=mintedbackground](title.south west)--(title.south east);},
frame code={\path[draw=mintedframe, fill=mintedbackground](frame.south west) rectangle (frame.north east);}
}
\begin{document}

\begin{myminted}{/files/location/on/system.sh}
#!/bin/bash
echo "I am a bash file"
\end{myminted}

\end{document}

Respuesta2

Esta respuesta se basa en la publicación inicial de Ignasi. Comencé a refinarlo solo para ver que ya había editado su respuesta para que fuera exactamente lo que necesitaba. Aún así, por si sirve de algo, y con la esperanza de que alguien se beneficie, este es mi enfoque hasta el momento. Sin embargo, requiere una versión más nueva de tcolorbox que la que se envió con texlive en los repositorios.

Esto es lo que se me ocurrió después de trabajar en su primer ejemplo:

\documentclass{report}

\usepackage[skins,minted]{tcolorbox}

\definecolor{mintedbackground}{rgb}{0.95,0.95,0.95}

% This is the bash profile used throughout the document.
% I've also got one for Python and console text (regular commands)
\setminted[bash]{
    bgcolor=mintedbackground,
    fontfamily=tt,
    linenos=true,
    numberblanklines=true,
    numbersep=12pt,
    numbersep=5pt,
    gobble=0,
    frame=leftline,
    framesep=2mm,
    funcnamehighlighting=true,
    tabsize=4,
    obeytabs=false,
    mathescape=false
    samepage=false,
    showspaces=false,
    showtabs =false,
    texcl=false,
    baselinestretch=1.2,
    fontsize=\footnotesize,
    breaklines=true,
}

\newtcblisting{myminted}[2][]{minted language=bash,
    enhanced, listing engine=minted,
    listing only, #1, title=#2, 
    colback=mintedbackground, colbacktitle=mintedbackground, coltitle=darkgray, 
    arc=0pt,outer arc=0pt, 
    boxrule=0mm, 
    toptitle=1mm, bottomtitle=1mm,
    titlerule=1pt, colframe=gray, titlerule style={mintedbackground, dashed}    
}

\begin{document}

\begin{myminted}{/files/location/on/system.sh}
    #!/bin/bash
    echo "I am a bash file"
\end{myminted}

\end{document}

Lo que da:

ingrese la descripción de la imagen aquí

Respuesta3

La respuesta aceptada por Ignasi no me funcionó. Agregar minted options={python3} dentro de la \newtcblistingdefinición funcionó para mí.

Respuesta4

Si permite una respuesta usando un paquete diferente, personalmente estoy usandolistingscon buenos resultados.

\documentclass{report}

\usepackage{listings}

\begin{document}

\begin{lstlisting}[title=/files/location/on/system.sh,language=bash,numbers=left]
#!/bin/bash
echo "I am a bash file"
\end{listing}

\end{document}

No lo he probado mintedtodavía; Me gustó listingslo fácil que era crear a) resaltado de sintaxis para un lenguaje específico de dominio que estaba usando, b) usar resaltado personalizado para representar una parte específica del código de manera diferente. También hay muchas opciones de renderizado/estilo.

información relacionada