Skip to content

Commit 2ac2378

Browse files
committed
Improve paragraph spacing in LaTeX output
1 parent 3e91c05 commit 2ac2378

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

src/markdown.mjs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,11 @@ function parseIndexTerm(state, silent) {
146146

147147
let term = state.src.slice(start, end)
148148

149-
if (!silent) state.push("meta_index", null, 0).args = [term]
149+
if (!silent) {
150+
let token = state.push("meta_index", null, 0)
151+
token.args = [term]
152+
token.inline = true
153+
}
150154
state.pending += term
151155
state.pos = end + 2
152156
return true

src/render_latex.mjs

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ function id(token) {
8282
let linkedChapter = null, raw = false, quote = false
8383

8484
let renderer = {
85-
fence(token) {
85+
fence(token, _i, _t, newlines) {
8686
if (/\bhidden:\s*true/.test(token.info)) return ""
8787
let esc = escapeComplexScripts(token.content.trimRight())
8888
if (noStarch) esc = esc.replace(/[]/g, '"').replace(//g, "...")
89-
return `\n\n${id(token)}\\begin{lstlisting}\n${esc}\n\\end{lstlisting}\n`
89+
return `${paraBreak(newlines)}${id(token)}\\begin{lstlisting}\n${esc}\n\\end{lstlisting}\n`
9090
},
9191

9292
hardbreak() { return "\\break\n" },
@@ -98,24 +98,25 @@ let renderer = {
9898
return raw ? content : escape(content)
9999
},
100100

101-
paragraph_open(token, i, tokens) {
101+
paragraph_open(token, i, tokens, newlines) {
102102
let noIndent = ""
103103
if (!noStarch) for (i--; i >= 0; i--) {
104104
let prev = tokens[i]
105105
if (prev.type == "fence") noIndent = "\\noindent "
106106
if (!/^meta_index/.test(prev.type)) break
107107
}
108-
let nl = "\n\n";
108+
let nl = paraBreak(newlines)
109109
if (quote) { nl = ""; quote = false }
110110
return nl + noIndent + id(token)
111111
},
112112
paragraph_close() { return "" },
113113

114-
heading_open(token) {
114+
heading_open(token, _i, _t, newlines) {
115+
let breaks = paraBreak(newlines)
115116
if (token.tag == "h1") return `\\${!["hints", "intro"].includes(chapter[1]) ? "chapter" : noStarch ? "chapter*" : "addchap"}{`
116-
if (token.tag == "h2") return `\n\n${id(token)}\\section{`
117-
if (token.tag == "h3") return `\n\n${id(token)}\\subsection{`
118-
if (token.tag == "h4") return `\n\n${id(token)}\\subsubsection{`
117+
if (token.tag == "h2") return `${breaks}${id(token)}\\section{`
118+
if (token.tag == "h3") return `${breaks}${id(token)}\\subsection{`
119+
if (token.tag == "h4") return `${breaks}${id(token)}\\subsubsection{`
119120
throw new Error("Can't handle heading tag " + token.tag)
120121
},
121122
heading_close(token) {
@@ -139,7 +140,7 @@ let renderer = {
139140
tr_open() { return "" },
140141
tr_close() { return "\n\\tabularnewline" },
141142
td_open() { return "\n" },
142-
td_close(_, next) { return next && next.type == "td_open" ? " &" : "" },
143+
td_close(_, i, tokens) { return tokens[i + 1] && tokens[i + 1].type == "td_open" ? " &" : "" },
143144

144145
code_inline(token) {
145146
if (noStarch)
@@ -160,11 +161,13 @@ let renderer = {
160161
sup_open() { return "\\textsuperscript{" },
161162
sup_close() { return "}" },
162163

163-
meta_indexsee(token) {
164-
return `\\index{${escapeIndex(token.args[0])}|see{${escapeIndex(token.args[1])}}}`
164+
meta_indexsee(token, _i, _t, newlines) {
165+
return paraBreak(newlines) +
166+
`\\index{${escapeIndex(token.args[0])}|see{${escapeIndex(token.args[1])}}}`
165167
},
166-
meta_index(token) {
167-
return token.args.map(term => `\\index{${escapeIndex(term)}}`).join("")
168+
meta_index(token, _, _t, newlines) {
169+
return (token.inline ? "" : paraBreak(newlines)) +
170+
token.args.map(term => `\\index{${escapeIndex(term)}}`).join("")
168171
},
169172

170173
meta_latex_open() { raw = true; return "" },
@@ -184,13 +187,13 @@ let renderer = {
184187

185188
inline(token) { return renderArray(token.children) },
186189

187-
meta_figure(token) {
190+
meta_figure(token, _i, _t, newlines) {
188191
let {url, width, chapter} = token.args[0]
189192
if (chapter) return "" // FIXME
190193
if (/\.svg$/.test(url)) url = url.replace(/^img\//, "img/generated/").replace(/\.svg$/, ".pdf")
191194
let graphics = `\\includegraphics[width=${width || "10cm"}]{${url}}`
192-
if (noStarch) return `\n\n\\begin{figure}[H]\n${graphics}\n\\end{figure}\n`
193-
return `\n\n\\vskip 1.5ex\n${graphics}\n\\vskip 1.5ex\n`
195+
if (noStarch) return `${paraBreak(newlines)}\\begin{figure}[H]\n${graphics}\n\\end{figure}\n`
196+
return `${paraBreak(newlines)}\\vskip 1.5ex\n${graphics}\n\\vskip 1.5ex\n`
194197
},
195198

196199
meta_quote_open(token) {
@@ -230,12 +233,16 @@ ${image ? `\\includegraphics[width=\\linewidth]{${image}}` : ''}
230233
meta_hint_close() { return "" }
231234
}
232235

236+
function paraBreak(newlines) {
237+
return "\n".repeat(Math.max(0, 2 - newlines))
238+
}
239+
233240
function renderArray(tokens) {
234241
let result = ""
235242
for (let i = 0; i < tokens.length; i++) {
236243
let token = tokens[i], f = renderer[token.type]
237244
if (!f) throw new Error("No render function for " + token.type)
238-
result += f(token, i, tokens)
245+
result += f(token, i, tokens, /\n*$/.exec(result)[0].length)
239246
}
240247
return result
241248
}

0 commit comments

Comments
 (0)