-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathconf.typ
128 lines (122 loc) · 5.27 KB
/
conf.typ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#let logos = (
escudo: "imagenes/institucion/escudoU2014.svg",
fcfm: "imagenes/institucion/fcfm.svg"
)
#let pronombre = (
el: (titulo: "O", guia: ""),
ella: (titulo: "A", guia: "A"),
elle: (titulo: "E", guia: "E"),
)
#let guia(visible: true, body) = if visible [
#set rect(width: 100%, stroke: black)
#set par(justify: true, first-line-indent: 0pt)
#block(breakable: false)[#stack(dir: ttb,
rect(fill: black, radius: (top: 5pt, bottom: 0pt), text(fill: white, "Guía (deshabilitar antes de entregar)")),
rect(fill: luma(230), radius: (top: 0pt, bottom: 5pt), body)
)]] else []
#let conf(
titulo: none,
autor: none, // diccionario con nombre y pronombre, (nombre: "", pronombre: pronombre.<el/ella/elle>)
informe: false, // false para propuesta, true para informe
codigo: "CC6908", // CC6908 para malla v3, CC6907 para malla v5
modalidad: "Memoria", // puede ser Memoria, Práctica Extendida, Doble Titulación con Magíster,Doble Titulación de Dos Especialidades
profesores: (), // si es solo un profesor guía, una lista de un elemento es ((nombre: "nombre apellido", pronombre: pronombre.<el/ella/elle>),))
coguias: (), // si es solo un profesor co-guía, una lista de un elemento es ((nombre: "nombre apellido", pronombre: pronombre.<el/ella/elle>),))
supervisor: none, // solo en caso de práctica extendida llenar esto, en otro caso none, (nombre: "nombre apellido", pronombre: pronombre.<el/ella/elle>)
anno: none, // si no se especifica, se usa el año actual
espaciado_titulo: 1fr, // espacio extra que rodea al título y al nombre en la portada, 1fr es lo mismo que el resto de espacios, 2fr es el doble, etc.
doc,
) = {
// Formato de página
set page(
paper: "us-letter",
number-align: center,
numbering: none,
// margin: (left: 3cm, rest: 2cm,) se configura después de la portada
)
// Formato de texto
set text(
lang: "es",
font: "New Computer Modern",
size: 12pt,
)
// Formato de headings
set heading(numbering: (..n) => {
if n.pos().len() == 1 [#numbering("1.", ..n) #h(1em)] // Espacio extra para headings de nivel 1
else if n.pos().len() == 2 [#none] // No numerar headings de nivel 2
else [#numbering("1.", ..n)] // Para el resto, numerar con formato 1.1.1.
})
let header = [
#set text(size: 13pt)
#stack(dir: ltr, spacing: 15pt,
[],
align(bottom+left, box(width: 1.35cm, image(logos.escudo))),
align(bottom+left, stack(dir: ttb, spacing: 5pt,
text("UNIVERSIDAD DE CHILE"),
text("FACULTAD DE CIENCIAS FÍSICAS Y MATEMÁTICAS"),
text("DEPARTAMENTO DE CIENCIAS DE LA COMPUTACIÓN"),
v(5pt),
),
)
)
]
let _propuesta = "PROPUESTA DE TEMA DE MEMORIA"
let _informe = "INFORME FINAL DE " + codigo
let _documento = [
#if informe [#_informe] else [#_propuesta]
PARA OPTAR AL TÍTULO DE \ INGENIER#autor.pronombre.titulo CIVIL EN COMPUTACIÓN]
let _modalidad = [MODALIDAD: \ #modalidad]
let _guia(gen: pronombre.el) = [PROFESOR#gen.guia GUÍA]
let _coguia(gen: pronombre.el) = [PROFESOR#gen.guia CO-GUÍA]
let _supervisor(gen: pronombre.el) = [SUPERVISOR#gen.guia]
let _ciudad = "SANTIAGO DE CHILE"
let _anno = if anno != none [#anno] else [#datetime.today().year()]
let portada = align(center)[
#stack(dir: ttb, spacing: 1fr,
..(
espaciado_titulo,
titulo,
0.5fr,
_documento,
espaciado_titulo,
upper(autor.nombre),
espaciado_titulo,
_modalidad,
if profesores.len() == 0 [#none]
else if profesores.len() == 1
[#_guia(gen: profesores.at(0).pronombre): \ #profesores.at(0).nombre]
else
[#_guia(gen: profesores.at(0).pronombre): \ #profesores.at(0).nombre \
#_guia(gen: profesores.at(1).pronombre) 2: \ #profesores.at(1).nombre],
if coguias.len() == 0 [#none]
else if coguias.len() == 1
[#_coguia(gen: coguias.at(0).pronombre): \ #coguias.at(0).nombre]
else
[#_coguia(gen: coguias.at(0).pronombre): \ #coguias.at(0).nombre \
#_coguia(gen: coguias.at(1).pronombre) 2: \ #coguias.at(1).nombre],
if supervisor == none [#none]
else [#_supervisor(gen: supervisor.pronombre): \ #supervisor.nombre],
[#_ciudad \ #_anno],).filter(it => it != [#none]),
)
]
// Portada
header
portada
// Comienza el documento, en página 1
set page(
numbering: "1",
margin: (left: 3cm, rest: 2cm,),
) // Activar numeración de páginas y márgenes
set par(
justify: true,
first-line-indent: 15pt,
) // Formato de párrafos
show par: set block(spacing: 2em) // Espacio entre párrafos
show heading: it => {
it
par(text(size:0.35em, h(0.0em)))
} // Workaround para que se aplique la indentación al primer párrafo luego de un heading
pagebreak(weak: true) // Salto de página
counter(page).update(1) // Reestablecer el contador de páginas
doc
}