9
9
10
10
symbols = [
11
11
["Lower-case Greek" ,
12
- 4 ,
13
12
(r"\alpha" ,r"\beta" ,r"\gamma" ,r"\chi" ,r"\delta" ,r"\epsilon" ,
14
13
r"\eta" ,r"\iota" ,r"\kappa" ,r"\lambda" ,r"\mu" ,r"\nu" ,r"\omega" ,
15
14
r"\phi" ,r"\pi" ,r"\psi" ,r"\rho" ,r"\sigma" ,r"\tau" ,r"\theta" ,
16
15
r"\upsilon" ,r"\xi" ,r"\zeta" ,r"\digamma" ,r"\varepsilon" ,r"\varkappa" ,
17
16
r"\varphi" ,r"\varpi" ,r"\varrho" ,r"\varsigma" ,r"\vartheta" )],
18
17
["Upper-case Greek" ,
19
- 4 ,
20
18
(r"\Delta" ,r"\Gamma" ,r"\Lambda" ,r"\Omega" ,r"\Phi" ,r"\Pi" ,r"\Psi" ,
21
19
r"\Sigma" ,r"\Theta" ,r"\Upsilon" ,r"\Xi" )],
22
20
["Hebrew" ,
23
- 6 ,
24
21
(r"\aleph" ,r"\beth" ,r"\gimel" ,r"\daleth" )],
25
22
["Latin named characters" ,
26
- 6 ,
27
23
r"""\aa \AA \ae \AE \oe \OE \O \o \thorn \Thorn \ss \eth \dh \DH""" .split ()],
28
24
["Delimiters" ,
29
- 5 ,
30
25
_mathtext .Parser ._delims ],
31
26
["Big symbols" ,
32
- 5 ,
33
27
_mathtext .Parser ._overunder_symbols | _mathtext .Parser ._dropsub_symbols ],
34
28
["Standard function names" ,
35
- 5 ,
36
29
{fr"\{ fn } " for fn in _mathtext .Parser ._function_names }],
37
30
["Binary operation symbols" ,
38
- 4 ,
39
31
_mathtext .Parser ._binary_operators ],
40
32
["Relation symbols" ,
41
- 4 ,
42
33
_mathtext .Parser ._relation_symbols ],
43
34
["Arrow symbols" ,
44
- 4 ,
45
35
_mathtext .Parser ._arrow_symbols ],
46
36
["Dot symbols" ,
47
- 4 ,
48
37
r"""\cdots \vdots \ldots \ddots \adots \Colon \therefore \because""" .split ()],
49
38
["Black-board characters" ,
50
- 6 ,
51
39
[fr"\{ symbol } " for symbol in _mathtext_data .tex2uni
52
40
if re .match (bb_pattern ,symbol )]],
53
41
["Script characters" ,
54
- 6 ,
55
42
[fr"\{ symbol } " for symbol in _mathtext_data .tex2uni
56
43
if re .match (scr_pattern ,symbol )]],
57
44
["Fraktur characters" ,
58
- 6 ,
59
45
[fr"\{ symbol } " for symbol in _mathtext_data .tex2uni
60
46
if re .match (frak_pattern ,symbol )]],
61
47
["Miscellaneous symbols" ,
62
- 4 ,
63
48
r"""\neg \infty \forall \wp \exists \bigstar \angle \partial
64
49
\nexists \measuredangle \emptyset \sphericalangle \clubsuit
65
50
\varnothing \complement \diamondsuit \imath \Finv \triangledown
71
56
\lambdabar \L \l \degree \danger \maltese \clubsuitopen
72
57
\i \hermitmatrix \sterling \nabla \mho""" .split ()],
73
58
]
74
-
59
+ def calculate_best_columns (symbols_list ,max_line_length ,min_columns ,max_columns ):
60
+ """
61
+ Calculate the best number of columns to fit the symbols within the given constraints.
62
+
63
+ Parameters:
64
+ symbols_list (list): A list of symbols to be displayed.
65
+ max_line_length (int): The maximum allowed length of a line.
66
+ min_columns (int): The minimum number of columns to consider.
67
+ max_columns (int): The maximum number of columns to consider.
68
+
69
+ Returns:
70
+ int: The best number of columns that fits within the constraints.
71
+ """
72
+ best_columns = min_columns
73
+ # Calculate the best number of columns
74
+ for columns in range (max_columns ,min_columns - 1 ,- 1 ):
75
+ flag = False
76
+ for i in range (0 ,len (symbols_list ),columns ):
77
+ line_length = sum (len (symbol )for symbol in symbols_list [i :i + columns ])+ len (symbols_list [i :i + columns ])- 1
78
+ # Check if the line length is less than or equal to max_line_length
79
+ if line_length > max_line_length :
80
+ flag = True
81
+ break
82
+ if not flag :
83
+ best_columns = columns
84
+ break
85
+ max_cell_width = max (len (sym )for sym in symbols_list )
86
+ return min (best_columns ,len (symbols_list ),max_line_length // max_cell_width )
75
87
76
88
def run (state_machine ):
77
89
@@ -86,15 +98,16 @@ def render_symbol(sym, ignore_variant=False):
86
98
return f'\\ { sym } ' if sym in ('\\ ' ,'|' ,'+' ,'-' ,'*' )else sym
87
99
88
100
lines = []
89
- for category ,columns , syms in symbols :
101
+ for category ,syms in symbols :
90
102
syms = sorted (syms ,
91
103
# Sort by Unicode and place variants immediately
92
104
# after standard versions.
93
105
key = lambda sym : (render_symbol (sym ,ignore_variant = True ),
94
106
sym .startswith (r"\var" )),
95
107
reverse = (category == "Hebrew" ))# Hebrew is rtl
96
108
rendered_syms = [f"{ render_symbol (sym )} ``{ sym } ``" for sym in syms ]
97
- columns = min (columns ,len (syms ))
109
+ max_line_length = 95
110
+ columns = calculate_best_columns (rendered_syms ,max_line_length = max_line_length ,min_columns = 4 ,max_columns = 6 )
98
111
lines .append ("**%s**" % category )
99
112
lines .append ('' )
100
113
max_width = max (map (len ,rendered_syms ))
@@ -128,13 +141,12 @@ def setup(app):
128
141
metadata = {'parallel_read_safe' :True ,'parallel_write_safe' :True }
129
142
return metadata
130
143
131
-
132
144
if __name__ == "__main__" :
133
145
# Do some verification of the tables
134
146
135
147
print ("SYMBOLS NOT IN STIX:" )
136
148
all_symbols = {}
137
- for category ,columns , syms in symbols :
149
+ for category ,syms in symbols :
138
150
if category == "Standard Function Names" :
139
151
continue
140
152
for sym in syms :