Skip to content

Commit 02df300

Browse files
committed
update LaTeX code and writer
1 parent a1b89bb commit 02df300

File tree

2 files changed

+40
-27
lines changed

2 files changed

+40
-27
lines changed

sphinx/texinputs/sphinxlatexobjects.sty

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -118,21 +118,32 @@
118118
% now restore \itemsep and \parskip
119119
\pysig@restore@itemsep@and@parskip
120120
}
121+
% Each signature is rendered as NAME<SPACE>[TPLIST]<SPACE>(ARGLIST) where the
122+
% size of <SPACE> is parametrized by \sphinxsignaturelistskip (0pt by default).
123+
\newlength\sphinxsignaturelistskip
124+
\setlength\sphinxsignaturelistskip{0pt}
125+
\newcommand{\pysigtplistopen}{\hskip\sphinxsignaturelistskip\sphinxcode{[}}
126+
\newcommand{\pysigtplistclose}{\sphinxcode{]}}
127+
\newcommand{\pysigarglistopen}{\hskip\sphinxsignaturelistskip\sphinxcode{(}}
128+
\newcommand{\pysigarglistclose}{\sphinxcode{)}}
121129
%
122130
% Use a \parbox to accommodate long argument list in signatures
123131
% LaTeX did not imagine that an \item label could need multi-line rendering
124132
\newlength{\py@argswidth}
125133
\newcommand{\py@sigparams}[2]{%
126134
% The \py@argswidth has been computed in \pysiglinewithargsret to make the
127135
% argument list use full available width
128-
\parbox[t]{\py@argswidth}{\raggedright #1\sphinxcode{)}#2\strut}%
136+
\parbox[t]{\py@argswidth}{\raggedright #1\pysigarglistclose#2\strut}%
129137
% final strut is to help get correct vertical separation
130138
}
131139
\newcommand{\py@sigparamswithtplist}[3]{%
132140
% similar to \py@sigparams but with different delimiters and an additional
133141
% type parameters list given as #1, the argument list as #2 and the return
134142
% annotation as #3
135-
\parbox[t]{\py@argswidth}{\raggedright #1\sphinxcode{]}\sphinxcode{(}#2\sphinxcode{)}#3\strut}%
143+
\parbox[t]{\py@argswidth}{%
144+
\raggedright #1\pysigtplistclose%
145+
\pysigarglistopen#2\pysigarglistclose%
146+
#3\strut}%
136147
}
137148

138149
\newcommand{\pysigline}[1]{%
@@ -147,26 +158,26 @@
147158
% as #1 may contain a footnote using \label we need to make \label
148159
% a no-op here to avoid LaTeX complaining about duplicates
149160
\let\spx@label\label\let\label\@gobble
150-
\settowidth{\py@argswidth}{#1\sphinxcode{(}}%
161+
\settowidth{\py@argswidth}{#1\pysigarglistopen}%
151162
\let\label\spx@label
152163
\py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax
153-
\item[{#1\sphinxcode{(}\py@sigparams{#2}{#3}\strut}]
164+
\item[{#1\pysigarglistopen\py@sigparams{#2}{#3}\strut}]
154165
\pysigadjustitemsep
155166
}
156167
\newcommand{\pysiglinewithargsretwithtplist}[4]{
157168
% #1 = name, #2 = tplist, #3 = arglist, #4 = retann
158169
\let\spx@label\label\let\label\@gobble
159-
\settowidth{\py@argswidth}{#1\sphinxcode{[}}%
170+
\settowidth{\py@argswidth}{#1\pysigtplistopen}%
160171
\let\label\spx@label
161172
\py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax
162-
\item[{#1\sphinxcode{[}\py@sigparamswithtplist{#2}{#3}{#4}\strut}]
173+
\item[{#1\pysigtplistopen\py@sigparamswithtplist{#2}{#3}{#4}\strut}]
163174
\pysigadjustitemsep
164175
}
165176

166177
\def\sphinxoptionalextraspace{0.5mm}
167178
\newcommand{\pysigwithonelineperarg}[3]{%
168179
% render each argument on its own line
169-
\item[#1\sphinxcode{(}\strut]
180+
\item[#1\pysigarglistopen\strut]
170181
\leavevmode\par\nopagebreak
171182
% this relies on \pysigstartsignatures having set \parskip to zero
172183
\begingroup
@@ -180,13 +191,13 @@
180191
\endgroup
181192
\global\let\sphinxparam\spx@sphinxparam
182193
% fulllineitems sets \labelwidth to be like \leftmargin
183-
\nopagebreak\noindent\kern-\labelwidth\sphinxcode{)}{#3}
194+
\nopagebreak\noindent\kern-\labelwidth\pysigarglistclose{#3}
184195
\pysigadjustitemsep
185196
}
186197
\newcommand{\pysigwithonelineperargwithonelinepertparg}[4]{
187198
% #1 = name, #2 = tplist, #3 = arglist, #4 = retann
188-
% render each type parameters and argument lists on its own line
189-
\item[#1\sphinxcode{[}\strut]
199+
% render each type parameter and argument on its own line
200+
\item[#1\pysigtplistopen\strut]
190201
\leavevmode\par\nopagebreak
191202
\begingroup
192203
\let\sphinxparamcomma\sphinxparamcommaoneperline
@@ -197,9 +208,9 @@
197208
\def\sphinxtypeparam{\def\sphinxtypeparam{\par\spx@sphinxtypeparam}\spx@sphinxtypeparam}%
198209
#2\par
199210
\endgroup
200-
\nopagebreak\noindent\kern-\labelwidth\sphinxcode{]}
211+
\nopagebreak\noindent\kern-\labelwidth\pysigtplistclose%
201212
% render the rest of the signature like in \pysigwithonelineperarg
202-
\sphinxcode{(}\strut\leavevmode\par\nopagebreak
213+
\pysigarglistopen\strut\par\nopagebreak
203214
\begingroup
204215
\let\sphinxparamcomma\sphinxparamcommaoneperline
205216
\def\sphinxoptionalhook{\ifvmode\else\kern\sphinxoptionalextraspace\relax\fi}%
@@ -208,13 +219,13 @@
208219
#3\par
209220
\endgroup
210221
\global\let\sphinxparam\spx@sphinxparam
211-
\nopagebreak\noindent\kern-\labelwidth\sphinxcode{)}{#4}
222+
\nopagebreak\noindent\kern-\labelwidth\pysigarglistclose{#4}
212223
\pysigadjustitemsep
213224
}
214225
\newcommand{\pysiglinewithargsretwithonelinepertparg}[4]{
215226
% #1 = name, #2 = tplist, #3 = arglist, #4 = retann
216-
% render each type parameters on its own line but the argument list is rendered inline
217-
\item[#1\sphinxcode{[}\strut]
227+
% render each type parameter on its own line but the arguments list inline
228+
\item[#1\pysigtplistopen\strut]
218229
\leavevmode\par\nopagebreak
219230
\begingroup
220231
\let\sphinxparamcomma\sphinxparamcommaoneperline
@@ -225,21 +236,20 @@
225236
\def\sphinxtypeparam{\def\sphinxtypeparam{\par\spx@sphinxtypeparam}\spx@sphinxtypeparam}%
226237
#2\par
227238
\endgroup
228-
\nopagebreak\noindent\kern-\labelwidth\sphinxcode{]}
239+
\nopagebreak\noindent\kern-\labelwidth\pysigtplistclose%
229240
% render the arguments list on one line
230-
\settowidth{\py@argswidth}{\sphinxcode{]}\sphinxcode{()}}%
231-
\py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax
232-
\sphinxcode{(}\parbox[t]{\py@argswidth}{\raggedright #3\sphinxcode{)}#4\strut}%
241+
\pysigarglistopen#3\pysigarglistclose#4\strut
233242
\pysigadjustitemsep
234243
}
235244
\newcommand{\pysigwithonelineperargwithtplist}[4]{
236245
% #1 = name, #2 = tplist, #3 = arglist, #4 = retann
237246
% render the type parameters list on one line, but each argument is rendered on its own line
238247
\let\spx@label\label\let\label\@gobble
239-
\settowidth{\py@argswidth}{#1\sphinxcode{[}}%
248+
\settowidth{\py@argswidth}{#1\pysigtplistopen}%
240249
\let\label\spx@label
241250
\py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax
242-
\item[{#1\sphinxcode{[}\parbox[t]{\py@argswidth}{\raggedright #2\sphinxcode{]}\sphinxcode{(}\strut}\strut}]
251+
\item[{#1\pysigtplistopen\parbox[t]{\py@argswidth}{%
252+
\raggedright #2\pysigtplistclose\pysigarglistopen\strut}\strut}]
243253
% render the rest of the signature like in \pysigwithonelineperarg
244254
\begingroup
245255
\let\sphinxparamcomma\sphinxparamcommaoneperline
@@ -249,7 +259,7 @@
249259
#3\par
250260
\endgroup
251261
\global\let\sphinxparam\spx@sphinxparam
252-
\nopagebreak\noindent\kern-\labelwidth\sphinxcode{)}{#4}
262+
\nopagebreak\noindent\kern-\labelwidth\pysigarglistclose{#4}
253263
\pysigadjustitemsep
254264
}
255265

sphinx/writers/latex.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -873,10 +873,7 @@ def _visit_sig_parameter(self, node: Element, parameter_macro: str) -> None:
873873
if not node.hasattr('noemph'):
874874
self.body.append(parameter_macro)
875875

876-
def visit_desc_parameter(self, node: Element) -> None:
877-
self._visit_sig_parameter(node, r'\sphinxparam{')
878-
879-
def depart_desc_parameter(self, node: Element) -> None:
876+
def _depart_sig_parameter(self, node: Element) -> None:
880877
if not node.hasattr('noemph'):
881878
self.body.append('}')
882879
is_required = self.list_is_required_param[self.param_group_index]
@@ -896,11 +893,17 @@ def depart_desc_parameter(self, node: Element) -> None:
896893
if is_required:
897894
self.param_group_index += 1
898895

896+
def visit_desc_parameter(self, node: Element) -> None:
897+
self._visit_sig_parameter(node, r'\sphinxparam{')
898+
899+
def depart_desc_parameter(self, node: Element) -> None:
900+
self._depart_sig_parameter(node)
901+
899902
def visit_desc_tparameter(self, node: Element) -> None:
900903
self._visit_sig_parameter(node, r'\sphinxtypeparam{')
901904

902905
def depart_desc_tparameter(self, node: Element) -> None:
903-
self.depart_desc_parameter(node)
906+
self._depart_sig_parameter(node)
904907

905908
def visit_desc_optional(self, node: Element) -> None:
906909
self.params_left_at_level = sum([isinstance(c, addnodes.desc_parameter)

0 commit comments

Comments
 (0)