Esta guía explica cómo incluir código fuente en tu documento usando los entornos predefinidos de esta plantilla, que utilizan minted con estilos visuales tipo VS Code.
- 📋 Índice
- Introducción
- Entornos disponibles
- Uso básico
- Opciones de personalización
- Incluir código desde archivo
- Código inline
- Resaltar líneas
- Crear entornos personalizados
- Solución de problemas
- Ejemplos completos
- Recursos adicionales
- Ver también
Esta plantilla incluye el paquete eps-codigo.sty que proporciona entornos predefinidos para más de 40 lenguajes de programación con tres temas visuales:
- VS Code Light (fondo claro) - Por defecto
- VS Code Dark (fondo oscuro) - Añadiendo
Darkal nombre del entorno - Simple (borde negro, sin colores de fondo) - Usando el entorno
codigosimple
Cada lenguaje tiene dos variantes:
- Con números de línea - Por defecto
- Sin números de línea - Añadiendo
NNal final
El resaltado de sintaxis usa minted 3.x con latexminted, que requiere Python. Al compilar con -shell-escape, minted ejecuta el resaltado automáticamente.
# Instalar latexminted (incluye Pygments automáticamente)
pip install latexminted| Lenguaje | Light | Light (sin líneas) | Dark | Dark (sin líneas) |
|---|---|---|---|---|
| Python | pythoncode |
pythoncodeNN |
pythoncodeDark |
pythoncodeDarkNN |
| JavaScript | jscode |
jscodeNN |
jscodeDark |
jscodeDarkNN |
| TypeScript | tscode |
tscodeNN |
tscodeDark |
tscodeDarkNN |
| Java | javacode |
javacodeNN |
javacodeDark |
javacodeDarkNN |
| C | ccode |
ccodeNN |
ccodeDark |
ccodeDarkNN |
| C++ | cppcode |
cppcodeNN |
cppcodeDark |
cppcodeDarkNN |
| C# | csharpcode |
csharpcodeNN |
csharpcodeDark |
csharpcodeDarkNN |
| Go | gocode |
gocodeNN |
gocodeDark |
gocodeDarkNN |
| Rust | rustcode |
rustcodeNN |
rustcodeDark |
rustcodeDarkNN |
| Swift | swiftcode |
swiftcodeNN |
swiftcodeDark |
swiftcodeDarkNN |
| Kotlin | kotlincode |
kotlincodeNN |
kotlincodeDark |
kotlincodeDarkNN |
| PHP | phpcode |
phpcodeNN |
phpcodeDark |
phpcodeDarkNN |
| Ruby | rubycode |
rubycodeNN |
rubycodeDark |
rubycodeDarkNN |
| R | rcode |
rcodeNN |
rcodeDark |
rcodeDarkNN |
| Scala | scalacode |
scalacodeNN |
- | - |
| Perl | perlcode |
perlcodeNN |
- | - |
| Haskell | haskellcode |
haskellcodeNN |
- | - |
| Lua | lualangcode |
lualangcodeNN |
lualangcodeDark |
lualangcodeDarkNN |
| Prolog | prologcode |
prologcodeNN |
prologcodeDark |
prologcodeDarkNN |
| MATLAB | matlabcode |
matlabcodeNN |
matlabcodeDark |
matlabcodeDarkNN |
| Fortran | fortrancode |
fortrancodeNN |
fortrancodeDark |
fortrancodeDarkNN |
| Lenguaje | Light | Light (sin líneas) | Dark | Dark (sin líneas) |
|---|---|---|---|---|
| HTML | htmlcode |
htmlcodeNN |
htmlcodeDark |
htmlcodeDarkNN |
| CSS | csscode |
csscodeNN |
csscodeDark |
csscodeDarkNN |
| SASS | sasscode |
sasscodeNN |
- | - |
| JSON | jsoncode |
jsoncodeNN |
jsoncodeDark |
jsoncodeDarkNN |
| XML | xmlcode |
xmlcodeNN |
- | - |
| YAML | yamlcode |
yamlcodeNN |
yamlcodeDark |
yamlcodeDarkNN |
| Markdown | mdcode |
mdcodeNN |
- | - |
| LaTeX | latexcode |
latexcodeNN |
- | - |
| TeX | texcode |
texcodeNN |
texcodeDark |
texcodeDarkNN |
| Lenguaje | Light | Light (sin líneas) | Dark | Dark (sin líneas) |
|---|---|---|---|---|
| Bash | bashcode |
bashcodeNN |
bashcodeDark |
bashcodeDarkNN |
| PowerShell | pscode |
pscodeNN |
- | - |
| Makefile | makecode |
makecodeNN |
- | - |
| Dockerfile | dockercode |
dockercodeNN |
dockercodeDark |
dockercodeDarkNN |
| INI/Config | inicode |
inicodeNN |
- | - |
| TOML | tomlcode |
tomlcodeNN |
- | - |
| Git | gitcode |
gitcodeNN |
- | - |
| Diff | diffcode |
diffcodeNN |
- | - |
| Lenguaje | Light | Light (sin líneas) | Dark | Dark (sin líneas) |
|---|---|---|---|---|
| SQL | sqlcode |
sqlcodeNN |
sqlcodeDark |
sqlcodeDarkNN |
| Nginx | nginxcode |
nginxcodeNN |
nginxcodeDark |
nginxcodeDarkNN |
| Apache | apachecode |
apachecodeNN |
apachecodeDark |
apachecodeDarkNN |
| MikroTik | mikrotikcode |
mikrotikcodeNN |
mikrotikcodeDark |
mikrotikcodeDarkNN |
| Lenguaje | Light | Light (sin líneas) | Dark | Dark (sin líneas) |
|---|---|---|---|---|
| Assembly | asmcode |
asmcodeNN |
asmcodeDark |
asmcodeDarkNN |
| VHDL | vhdlcode |
vhdlcodeNN |
vhdlcodeDark |
vhdlcodeDarkNN |
| Verilog | verilogcode |
verilogcodeNN |
verilogcodeDark |
verilogcodeDarkNN |
| Variante | Entorno |
|---|---|
| Light con líneas | \begin{codigo}{lenguaje}...\end{codigo} |
| Light sin líneas | \begin{codigoNN}{lenguaje}...\end{codigoNN} |
| Dark con líneas | \begin{codigoDark}{lenguaje}...\end{codigoDark} |
| Dark sin líneas | \begin{codigoDarkNN}{lenguaje}...\end{codigoDarkNN} |
| Simple con líneas | \begin{codigosimple}{lenguaje}{Título}...\end{codigosimple} |
| Simple sin líneas | \begin{codigosimpleNN}{lenguaje}{Título}...\end{codigosimpleNN} |
\begin{pythoncode}
def fibonacci(n):
"""Calcula el n-ésimo número de Fibonacci."""
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
# Uso
for i in range(10):
print(f"F({i}) = {fibonacci(i)}")
\end{pythoncode}Resultado:
\begin{pythoncodeDark}
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quicksort(left) + middle + quicksort(right)
\end{pythoncodeDark}Resultado:
\begin{jscodeNN}
const greeting = "Hello, World!";
console.log(greeting);
\end{jscodeNN}Resultado:
Ideal para versiones impresas o cuando se prefiere un estilo minimalista. A diferencia de los otros entornos, este requiere que indiques el lenguaje y el título como argumentos obligatorios.
\begin{codigosimple}{python}{Script de Análisis}
def calcular_media(datos):
"""Calcula la media aritmética."""
if not datos:
return 0
return sum(datos) / len(datos)
\end{codigosimple}Resultado:
Todos los entornos aceptan opciones opcionales entre corchetes [...]. Las opciones principales son:
\begin{pythoncode}[title={Mi algoritmo de ordenación}]
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
\end{pythoncode}Resultado:
\begin{pythoncode}[title={Algoritmo de búsqueda binaria}, label={cod:busqueda-binaria}]
def busqueda_binaria(arr, x):
izq, der = 0, len(arr) - 1
while izq <= der:
mid = (izq + der) // 2
if arr[mid] == x:
return mid
elif arr[mid] < x:
izq = mid + 1
else:
der = mid - 1
return -1
\end{pythoncode}Resultado:
Para referenciar: Como se muestra en el Código~\ref{cod:busqueda-binaria}...
Puedes pasar opciones adicionales a minted:
\begin{pythoncode}[
minted options={
fontsize=\footnotesize,
linenos=true,
firstnumber=100,
highlightlines={3-5},
highlightcolor=yellow!30
}
]
# Este código empieza en la línea 100
def ejemplo():
# Estas líneas están resaltadas
importante = True
muy_importante = True
return importante and muy_importante
\end{pythoncode}| Opción | Descripción | Ejemplo |
|---|---|---|
fontsize |
Tamaño de fuente | \small, \footnotesize, \scriptsize |
linenos |
Mostrar números de línea | true, false |
firstnumber |
Número de la primera línea | 100 |
highlightlines |
Líneas a resaltar | {3-5,8,10-12} |
highlightcolor |
Color de resaltado | yellow!30 |
style |
Estilo de Pygments | monokai, friendly, colorful |
bgcolor |
Color de fondo | gray!10 |
breaklines |
Romper líneas largas | true, false |
breakanywhere |
Romper en cualquier lugar | true, false |
tabsize |
Tamaño de tabulación | 2, 4 |
showspaces |
Mostrar espacios | true, false |
showtabs |
Mostrar tabulaciones | true, false |
obeytabs |
Respetar tabulaciones | true, false |
autogobble |
Eliminar indentación común | true, false |
xleftmargin |
Margen izquierdo | 1em, 2cm |
xrightmargin |
Margen derecho | 1em, 2cm |
| Opción | Descripción | Ejemplo |
|---|---|---|
title |
Título del bloque | Mi código |
label |
Etiqueta para referencias | cod:mi-codigo |
colback |
Color de fondo | white |
colframe |
Color del borde | blue!50!black |
coltitle |
Color del texto del título | white |
colbacktitle |
Color de fondo del título | blue |
fonttitle |
Fuente del título | \bfseries |
arc |
Radio de las esquinas | 0pt, 3mm |
boxrule |
Grosor del borde | 1pt, 0.5mm |
left |
Padding izquierdo | 5pt |
right |
Padding derecho | 5pt |
top |
Padding superior | 3pt |
bottom |
Padding inferior | 3pt |
width |
Ancho del bloque | 0.8\textwidth |
% Código Python desde archivo
\inputminted[
linenos,
fontsize=\small,
firstline=10,
lastline=50
]{python}{recursos/codigo/mi_script.py}% En el preámbulo o en un archivo .sty
\newtcbinputlisting{\pythonfile}[2][]{
vscode-light-linenos,
minted language=python,
listing file={#2},
title={\faIcon{python}~~#2},
#1
}
% En el documento
\pythonfile{recursos/codigo/algoritmo.py}
% Con opciones
\pythonfile[
title={Mi algoritmo personalizado},
minted options={firstline=20, lastline=45}
]{recursos/codigo/algoritmo.py}% Para incluir solo ciertas líneas de un archivo
\begin{tcblisting}{
vscode-light-linenos,
listing file={recursos/codigo/servidor.py},
minted language=python,
minted options={firstline=50, lastline=80},
title={\faIcon{python}~~Configuración del servidor (líneas 50-80)}
}
\end{tcblisting}La función \mintinline{python}{print("Hola")} muestra texto en pantalla.
En JavaScript usamos \mintinline{javascript}{const x = 10} para declarar constantes.
El comando SQL \mintinline{sql}{SELECT * FROM usuarios} obtiene todos los registros.Resultado:
% Con estilo diferente
\mintinline[style=colorful]{python}{lambda x: x**2}
% Con fondo
\mintinline[bgcolor=gray!20]{bash}{sudo apt update}
% Con tamaño diferente
\mintinline[fontsize=\large]{java}{public static void main}Resultado:
% En el preámbulo
\newcommand{\py}[1]{\mintinline{python}{#1}}
\newcommand{\js}[1]{\mintinline{javascript}{#1}}
\newcommand{\sql}[1]{\mintinline{sql}{#1}}
% En el documento
La función \py{range(10)} genera números del 0 al 9.Resultado:
\begin{pythoncode}[minted options={highlightlines={2,4-6}, highlightcolor=yellow!40}]
def procesar_datos(datos):
resultado = [] # Esta línea está resaltada
for item in datos:
valor = transformar(item) # Líneas 4-6
resultado.append(valor) # están
contador += 1 # resaltadas
return resultado
\end{pythoncode}Resultado:
% Definir colores primero
\definecolor{resaltado1}{RGB}{255,255,150}
\definecolor{resaltado2}{RGB}{150,255,150}
% Usar en el código
\begin{pythoncode}[minted options={highlightlines={3}, highlightcolor=resaltado1}]
def ejemplo():
paso_1 = inicializar()
paso_importante = procesar() % Resaltado
return paso_importante
\end{pythoncode}Resultado:
% En el preámbulo o archivo .sty
% Definir colores del tema
\definecolor{mi-bg}{HTML}{F5F5F5}
\definecolor{mi-frame}{HTML}{4A90A4}
\definecolor{mi-title-bg}{HTML}{4A90A4}
\definecolor{mi-title-text}{HTML}{FFFFFF}
% Crear el estilo base
\tcbset{
mi-estilo/.style={
enhanced,
breakable,
colback=mi-bg,
colframe=mi-frame,
coltitle=mi-title-text,
colbacktitle=mi-title-bg,
arc=6pt,
boxrule=1.5pt,
left=5pt,
right=5pt,
top=3pt,
bottom=3pt,
listing only,
listing engine=minted,
fonttitle=\bfseries\sffamily,
}
}
% Crear entorno para Arduino
\newtcblisting{arduinocode}[1][]{
mi-estilo,
minted language=cpp,
minted options={linenos, fontsize=\small},
title={\faIcon{microchip}~~Arduino},
#1
}% Entorno que aparece en el índice de listados
\newtcblisting[
auto counter,
number within=chapter,
list inside=listings
]{codigofloat}[3][]{
vscode-light-linenos,
minted language=#2,
title={Código~\thetcbcounter:~#3},
label={#1},
list entry={#3}
}
% Uso
\begin{codigofloat}[cod:ejemplo]{python}{Función de factorial}
def factorial(n):
if n <= 1:
return 1
return n * factorial(n-1)
\end{codigofloat}Causa: minted necesita ejecutar latexminted externamente.
Solución: Compila con la opción -shell-escape:
lualatex -shell-escape main.texO en VS Code, asegúrate de que el archivo .vscode/settings.json tenga:
"latex-workshop.latex.tools": [
{
"name": "lualatex",
"command": "lualatex",
"args": [
"-shell-escape",
"-synctex=1",
"-interaction=nonstopmode",
"%DOC%"
]
}
]Causa: Python o latexminted no están instalados.
Solución:
# Linux/Mac
pip install latexminted
# Windows
py -m pip install latexminted
# Verificar instalación
latexminted --versionCausa: El lenguaje especificado no existe en Pygments.
Solución: Usa uno de los lenguajes soportados. Lista completa:
python -c "from pygments.lexers import get_all_lexers; print([l[1][0] for l in get_all_lexers()])"O consulta la documentación de Pygments.
Causas posibles:
- Caracteres especiales en LaTeX (
%,#,$,&,\) - Indentación incorrecta
Solución: El entorno minted escapa automáticamente estos caracteres, pero si hay problemas:
\begin{pythoncode}
# Los caracteres especiales funcionan normalmente
precio = 100 # 50% de descuento = $50
formula = "E = mc^2"
\end{pythoncode}Solución: Las opciones breaklines y breakanywhere ya están activadas por defecto. Para ajustar:
\begin{pythoncode}[
minted options={
breaklines=true,
breakanywhere=true,
breakautoindent=true,
breaksymbolleft=\tiny\ensuremath{\hookrightarrow}
}
]
# Código con líneas muy largas que se romperán automáticamente
una_variable_con_nombre_muy_largo = funcion_con_muchos_parametros(param1, param2, param3, param4, param5)
\end{pythoncode}Solución: Esta plantilla usa LuaLaTeX que soporta Unicode nativamente. Si hay problemas:
\begin{pythoncode}[
minted options={encoding=utf8}
]
def saludar(nombre):
return f"¡Hola, {nombre}! 👋"
\end{pythoncode}\begin{figure}[htbp]
\centering
\begin{minipage}{0.48\textwidth}
\begin{pythoncodeNN}[title={Bubble Sort - O(n²)}]
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = \
arr[j+1], arr[j]
\end{pythoncodeNN}
\end{minipage}
\hfill
\begin{minipage}{0.48\textwidth}
\begin{pythoncodeDarkNN}[title={Quick Sort - O(n log n)}]
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
left = [x for x in arr[1:]
if x < pivot]
right = [x for x in arr[1:]
if x >= pivot]
return quick_sort(left) + \
[pivot] + quick_sort(right)
\end{pythoncodeDarkNN}
\end{minipage}
\caption{Comparación de algoritmos de ordenación}
\label{fig:comparacion-sort}
\end{figure}Resultado:
\begin{pythoncode}[title={API REST con Flask}, minted options={highlightlines={5-8}}]
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/api/users', methods=['GET'])
def get_users():
"""Endpoint para obtener usuarios."""
return jsonify(users)
@app.route('/api/users/<int:id>', methods=['GET'])
def get_user(id):
user = next((u for u in users if u['id'] == id), None)
if user:
return jsonify(user)
return jsonify({'error': 'Not found'}), 404
if __name__ == '__main__':
app.run(debug=True)
\end{pythoncode}
Las líneas resaltadas (5-8) muestran el decorador de ruta y la función
que maneja las peticiones GET al endpoint \mintinline{text}{/api/users}.Resultado:
\begin{codigo}[title={Algoritmo de Dijkstra (pseudocódigo)}]{text}
DIJKSTRA(G, origen):
dist[origen] = 0
PARA cada vértice v en G:
SI v ≠ origen:
dist[v] = INFINITO
AÑADIR v a Q
MIENTRAS Q no está vacío:
u = vértice en Q con mínimo dist[u]
ELIMINAR u de Q
PARA cada vecino v de u:
alt = dist[u] + peso(u, v)
SI alt < dist[v]:
dist[v] = alt
previo[v] = u
DEVOLVER dist[], previo[]
\end{codigo}Resultado:
| Recurso | Descripción |
|---|---|
| minted en CTAN | Documentación oficial del paquete |
| latexminted en PyPI | Ejecutable Python para minted 3.x |
| tcolorbox en CTAN | Documentación de cajas personalizadas |
| Recurso | Descripción |
|---|---|
| Pygments Home | Sitio oficial |
| Lista de Lexers | Lenguajes soportados |
| Estilos disponibles | Temas de resaltado |
| Plataforma | Soporte minted 3.x | Notas |
|---|---|---|
| TeX Live 2025 | ✅ Completo | -shell-escape opcional en TL2024+ |
| Overleaf | ✅ Completo | Funciona automáticamente |
| arXiv | ✅ Desde sept. 2025 | Ver arXiv TeX Live 2025 |
| MiKTeX | ✅ Completo | Requiere -enable-write18 |
Nota sobre minted 3.x: A partir de TeX Live 2024, el ejecutable
latexmintedestá en la lista de programas confiables de TeX, por lo que-shell-escapeya no es estrictamente necesario en muchos casos. Sin embargo, se recomienda seguir usándolo por compatibilidad.
- GUIA_PRINCIPIANTES.md - Introducción a LaTeX
- TABLAS.md - Guía de tablas
- FIGURAS_GRAFICAS.md - Guía de gráficas con pgfplots













