metanorma-iec 1.4.1 → 1.4.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dde0fc97c56d1bc99719089986d636bb6c4a09c3c16299cc7c7437bf646909d5
4
- data.tar.gz: a97f30a1964f8b48ae6db39b2384653fe15f8bafbdca0740852f8e856fc6d0a7
3
+ metadata.gz: 2cd54ae113583e981d0db28b08ed00eb92f1b07a79d395c1d907860270889b59
4
+ data.tar.gz: bb89fee2a134f6affa9a94d21da24a9ef2c827bb5a5ea03991d405325fe101b0
5
5
  SHA512:
6
- metadata.gz: a780b66ab532b7d2f5f6e827b9147817c032e517188799c8941e52a29b2be60066cd31ebdbe5121aeac27a99a4cb72262f12770cdb8d1941a15da2885226ac2a
7
- data.tar.gz: d06c63ac625b6b8ad2da7bd159ec021206d530ee9c92236219155d0b27ff467cef6be4de4f679471366cd70e4f00093899f25fa5cc5237c8286b64f2e5c98b3c
6
+ metadata.gz: 1b3b33b44d4f1434415774b9ceccdff08a48ce8983aee4e7717e5a217fb47bfbfa77b447d70dd4a4530e5fd0e36e9158ebc18ff9ff58a07d4e3a7d80aee82219
7
+ data.tar.gz: 4aa8430cb7caa4450916cf7a677612c937183e62a77b938787f4baf76e4d63fa4de0630283bc761cdd30063aca1df8472a8e5098bc9b453121f9eec75038c684
data/Gemfile CHANGED
@@ -5,3 +5,5 @@ source "https://rubygems.org"
5
5
 
6
6
  # Specify your gem's dependencies in gemspec
7
7
  gemspec
8
+
9
+ gem "reline", "~> 0.2.8.pre.11"
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
- require 'isodoc/gem_tasks'
3
+ require "isodoc/gem_tasks"
4
4
 
5
5
  IsoDoc::GemTasks.install
6
6
  RSpec::Core::RakeTask.new(:spec)
@@ -1,6 +1,6 @@
1
1
  require "asciidoctor"
2
2
  require "metanorma-iso"
3
- require_relative "./front.rb"
3
+ require_relative "./front"
4
4
 
5
5
  module Asciidoctor
6
6
  module Iec
@@ -12,7 +12,10 @@ module Asciidoctor
12
12
 
13
13
  def init(node)
14
14
  super
15
- @is_iev = node.attr("docnumber") == "60050"
15
+ if @is_iev = node.attr("docnumber") == "60050"
16
+ @vocab = true
17
+ node.set_attr("docsubtype", "vocabulary")
18
+ end
16
19
  end
17
20
 
18
21
  def boilerplate_file(x_orig)
@@ -26,13 +29,15 @@ module Asciidoctor
26
29
 
27
30
  def doctype_validate(xmldoc)
28
31
  doctype = xmldoc&.at("//bibdata/ext/doctype")&.text
29
- %w(international-standard technical-specification technical-report
30
- publicly-available-specification international-workshop-agreement
31
- guide interpretation-sheet).include? doctype or
32
- @log.add("Document Attributes", nil, "#{doctype} is not a recognised document type")
32
+ %w(international-standard technical-specification technical-report
33
+ publicly-available-specification international-workshop-agreement
34
+ guide interpretation-sheet).include? doctype or
35
+ @log.add("Document Attributes", nil,
36
+ "#{doctype} is not a recognised document type")
33
37
  if function = xmldoc&.at("//bibdata/ext/function")&.text
34
- %w(emc quality-assurance safety environment).include? function or
35
- @log.add("Document Attributes", nil, "#{function} is not a recognised document function")
38
+ %w(emc quality-assurance safety environment).include? function or
39
+ @log.add("Document Attributes", nil,
40
+ "#{function} is not a recognised document function")
36
41
  end
37
42
  end
38
43
 
@@ -43,29 +48,43 @@ module Asciidoctor
43
48
  end
44
49
 
45
50
  def html_converter(node)
46
- node.nil? ? IsoDoc::Iec::HtmlConvert.new({}) :
51
+ if node.nil?
52
+ IsoDoc::Iec::HtmlConvert.new({})
53
+ else
47
54
  IsoDoc::Iec::HtmlConvert.new(html_extract_attributes(node))
55
+ end
48
56
  end
49
57
 
50
58
  def doc_converter(node)
51
- node.nil? ? IsoDoc::Iec::WordConvert.new({}) :
59
+ if node.nil?
60
+ IsoDoc::Iec::WordConvert.new({})
61
+ else
52
62
  IsoDoc::Iec::WordConvert.new(doc_extract_attributes(node))
63
+ end
53
64
  end
54
65
 
55
66
  def pdf_converter(node)
56
67
  return if node.attr("no-pdf")
57
- node.nil? ? IsoDoc::Iec::PdfConvert.new({}) :
58
- IsoDoc::Iec::PdfConvert.new(doc_extract_attributes(node))
68
+
69
+ if node.nil?
70
+ IsoDoc::Iec::PdfConvert.new({})
71
+ else
72
+ IsoDoc::Iec::PdfConvert.new(pdf_extract_attributes(node))
73
+ end
59
74
  end
60
75
 
61
76
  def presentation_xml_converter(node)
62
- node.nil? ? IsoDoc::Iec::PresentationXMLConvert.new({}) :
77
+ if node.nil?
78
+ IsoDoc::Iec::PresentationXMLConvert.new({})
79
+ else
63
80
  IsoDoc::Iec::PresentationXMLConvert.new(doc_extract_attributes(node))
81
+ end
64
82
  end
65
83
 
66
- def norm_ref_preface(f)
84
+ def norm_ref_preface(node)
67
85
  return super unless @is_iev
68
- f.at("./title").next =
86
+
87
+ node.at("./title").next =
69
88
  "<p>#{@i18n.norm_empty_pref}</p>"
70
89
  end
71
90
 
@@ -73,19 +92,17 @@ module Asciidoctor
73
92
  return super unless @is_iev
74
93
  end
75
94
 
76
- def sts_converter(node)
77
- end
78
-
79
- def sections_names_cleanup(x)
95
+ def sections_names_cleanup(xml)
80
96
  super
81
- @is_iev and replace_title(x, "//introduction", @i18n&.introduction_iev)
97
+ @is_iev and replace_title(xml, "//introduction",
98
+ @i18n&.introduction_iev)
82
99
  end
83
100
 
84
- def note(n)
85
- if n.title == "Note from TC/SC Officers"
101
+ def note(note)
102
+ if note.title == "Note from TC/SC Officers"
86
103
  noko do |xml|
87
104
  xml.tc_sc_officers_note do |c|
88
- wrap_in_para(n, c)
105
+ wrap_in_para(note, c)
89
106
  end
90
107
  end.join("\n")
91
108
  else
@@ -95,11 +112,11 @@ module Asciidoctor
95
112
 
96
113
  def note_cleanup(xmldoc)
97
114
  super
98
- n = xmldoc.at("//tc-sc-officers-note") and xmldoc.at("//bibdata/ext").add_child(n.remove)
115
+ n = xmldoc.at("//tc-sc-officers-note") and
116
+ xmldoc.at("//bibdata/ext").add_child(n.remove)
99
117
  end
100
118
 
101
- def image_name_validate(xmldoc)
102
- end
119
+ def image_name_validate(xmldoc); end
103
120
  end
104
121
  end
105
122
  end
@@ -199,9 +199,8 @@ module Asciidoctor
199
199
  end
200
200
  end
201
201
 
202
- def metadata_doctype(node, xml)
203
- xml.doctype doctype(node)
204
- xml.horizontal (node.attr("horizontal") || "false")
202
+ def metadata_subdoctype(node, xml)
203
+ super
205
204
  a = node.attr("function") and xml.function a
206
205
  end
207
206
 
@@ -57,6 +57,54 @@
57
57
  <ref name="tc-sc-officers-note"/>
58
58
  </optional>
59
59
  </define>
60
+ <define name="term">
61
+ <element name="term">
62
+ <optional>
63
+ <attribute name="id">
64
+ <data type="ID"/>
65
+ </attribute>
66
+ </optional>
67
+ <optional>
68
+ <attribute name="language"/>
69
+ </optional>
70
+ <optional>
71
+ <attribute name="script"/>
72
+ </optional>
73
+ <optional>
74
+ <attribute name="tag"/>
75
+ </optional>
76
+ <optional>
77
+ <attribute name="multilingual-rendering">
78
+ <ref name="MultilingualRenderingType"/>
79
+ </attribute>
80
+ </optional>
81
+ <oneOrMore>
82
+ <ref name="preferred"/>
83
+ </oneOrMore>
84
+ <zeroOrMore>
85
+ <ref name="admitted"/>
86
+ </zeroOrMore>
87
+ <zeroOrMore>
88
+ <ref name="deprecates"/>
89
+ </zeroOrMore>
90
+ <optional>
91
+ <ref name="termdomain"/>
92
+ </optional>
93
+ <ref name="termdefinition"/>
94
+ <zeroOrMore>
95
+ <ref name="termnote"/>
96
+ </zeroOrMore>
97
+ <zeroOrMore>
98
+ <ref name="termexample"/>
99
+ </zeroOrMore>
100
+ <zeroOrMore>
101
+ <ref name="termsource"/>
102
+ </zeroOrMore>
103
+ <zeroOrMore>
104
+ <ref name="term"/>
105
+ </zeroOrMore>
106
+ </element>
107
+ </define>
60
108
  </include>
61
109
  <!-- end overrides -->
62
110
  <define name="function">
@@ -58,7 +58,7 @@
58
58
  <attribute name="alt"/>
59
59
  </optional>
60
60
  <optional>
61
- <attribute name="updatetype">
61
+ <attribute name="update-type">
62
62
  <data type="boolean"/>
63
63
  </attribute>
64
64
  </optional>
@@ -1796,6 +1796,20 @@
1796
1796
  <data type="ID"/>
1797
1797
  </attribute>
1798
1798
  </optional>
1799
+ <optional>
1800
+ <attribute name="language"/>
1801
+ </optional>
1802
+ <optional>
1803
+ <attribute name="script"/>
1804
+ </optional>
1805
+ <optional>
1806
+ <attribute name="tag"/>
1807
+ </optional>
1808
+ <optional>
1809
+ <attribute name="multilingual-rendering">
1810
+ <ref name="MultilingualRenderingType"/>
1811
+ </attribute>
1812
+ </optional>
1799
1813
  <oneOrMore>
1800
1814
  <ref name="preferred"/>
1801
1815
  </oneOrMore>
@@ -1814,9 +1828,6 @@
1814
1828
  <optional>
1815
1829
  <ref name="termsubject"/>
1816
1830
  </optional>
1817
- <optional>
1818
- <ref name="termusage"/>
1819
- </optional>
1820
1831
  <oneOrMore>
1821
1832
  <ref name="termdefinition"/>
1822
1833
  </oneOrMore>
@@ -1880,17 +1891,37 @@
1880
1891
  </attribute>
1881
1892
  </optional>
1882
1893
  <optional>
1883
- <attribute name="geographicArea"/>
1894
+ <attribute name="geographic-area"/>
1884
1895
  </optional>
1885
1896
  <choice>
1886
1897
  <ref name="expression_designation"/>
1887
1898
  <ref name="letter_symbol_designation"/>
1888
1899
  <ref name="graphical_symbol_designation"/>
1889
1900
  </choice>
1901
+ <optional>
1902
+ <ref name="fieldofapplication"/>
1903
+ </optional>
1904
+ <optional>
1905
+ <ref name="usageinfo"/>
1906
+ </optional>
1890
1907
  <zeroOrMore>
1891
1908
  <ref name="termsource"/>
1892
1909
  </zeroOrMore>
1893
1910
  </define>
1911
+ <define name="fieldofapplication">
1912
+ <element name="field-of-application">
1913
+ <oneOrMore>
1914
+ <ref name="PureTextElement"/>
1915
+ </oneOrMore>
1916
+ </element>
1917
+ </define>
1918
+ <define name="usageinfo">
1919
+ <element name="usage-info">
1920
+ <oneOrMore>
1921
+ <ref name="PureTextElement"/>
1922
+ </oneOrMore>
1923
+ </element>
1924
+ </define>
1894
1925
  <define name="letter_symbol_designation">
1895
1926
  <element name="letter-symbol">
1896
1927
  <optional>
@@ -1942,11 +1973,15 @@
1942
1973
  </optional>
1943
1974
  <element name="name">
1944
1975
  <zeroOrMore>
1945
- <ref name="PureTextElement"/>
1976
+ <choice>
1977
+ <ref name="PureTextElement"/>
1978
+ <ref name="stem"/>
1979
+ <ref name="index"/>
1980
+ </choice>
1946
1981
  </zeroOrMore>
1947
1982
  </element>
1948
1983
  <optional>
1949
- <element name="abbreviationType">
1984
+ <element name="abbreviation-type">
1950
1985
  <ref name="AbbreviationType"/>
1951
1986
  </element>
1952
1987
  </optional>
@@ -1956,7 +1991,7 @@
1956
1991
  </element>
1957
1992
  </optional>
1958
1993
  <optional>
1959
- <element name="grammarInfo">
1994
+ <element name="grammar">
1960
1995
  <ref name="Grammar"/>
1961
1996
  </element>
1962
1997
  </optional>
@@ -1983,6 +2018,11 @@
1983
2018
  <ref name="GrammarGender"/>
1984
2019
  </element>
1985
2020
  </zeroOrMore>
2021
+ <zeroOrMore>
2022
+ <element name="number">
2023
+ <ref name="GrammarNumber"/>
2024
+ </element>
2025
+ </zeroOrMore>
1986
2026
  <optional>
1987
2027
  <element name="isPreposition">
1988
2028
  <data type="boolean"/>
@@ -2014,7 +2054,7 @@
2014
2054
  </element>
2015
2055
  </optional>
2016
2056
  <zeroOrMore>
2017
- <element name="grammarvalue">
2057
+ <element name="grammar-value">
2018
2058
  <text/>
2019
2059
  </element>
2020
2060
  </zeroOrMore>
@@ -2027,6 +2067,13 @@
2027
2067
  <value>common</value>
2028
2068
  </choice>
2029
2069
  </define>
2070
+ <define name="GrammarNumber">
2071
+ <choice>
2072
+ <value>singular</value>
2073
+ <value>dual</value>
2074
+ <value>plural</value>
2075
+ </choice>
2076
+ </define>
2030
2077
  <define name="termdomain">
2031
2078
  <element name="domain">
2032
2079
  <oneOrMore>
@@ -2041,13 +2088,6 @@
2041
2088
  </oneOrMore>
2042
2089
  </element>
2043
2090
  </define>
2044
- <define name="termusage">
2045
- <element name="usageinfo">
2046
- <oneOrMore>
2047
- <ref name="BasicBlock"/>
2048
- </oneOrMore>
2049
- </element>
2050
- </define>
2051
2091
  <define name="termdefinition">
2052
2092
  <element name="definition">
2053
2093
  <choice>
@@ -2061,13 +2101,16 @@
2061
2101
  </element>
2062
2102
  </define>
2063
2103
  <define name="verbaldefinition">
2064
- <element name="verbaldefinition">
2104
+ <element name="verbal-definition">
2065
2105
  <oneOrMore>
2066
2106
  <choice>
2067
2107
  <ref name="paragraph"/>
2068
2108
  <ref name="dl"/>
2069
2109
  <ref name="ol"/>
2070
2110
  <ref name="ul"/>
2111
+ <ref name="table"/>
2112
+ <ref name="figure"/>
2113
+ <ref name="formula"/>
2071
2114
  </choice>
2072
2115
  </oneOrMore>
2073
2116
  <zeroOrMore>
@@ -2076,7 +2119,7 @@
2076
2119
  </element>
2077
2120
  </define>
2078
2121
  <define name="nonverbalrep">
2079
- <element name="nonverbalrepresentation">
2122
+ <element name="non-verbal-representation">
2080
2123
  <oneOrMore>
2081
2124
  <choice>
2082
2125
  <ref name="table"/>
@@ -159,6 +159,20 @@
159
159
  <data type="ID"/>
160
160
  </attribute>
161
161
  </optional>
162
+ <optional>
163
+ <attribute name="language"/>
164
+ </optional>
165
+ <optional>
166
+ <attribute name="script"/>
167
+ </optional>
168
+ <optional>
169
+ <attribute name="tag"/>
170
+ </optional>
171
+ <optional>
172
+ <attribute name="multilingual-rendering">
173
+ <ref name="MultilingualRenderingType"/>
174
+ </attribute>
175
+ </optional>
162
176
  <ref name="preferred"/>
163
177
  <zeroOrMore>
164
178
  <ref name="admitted"/>
@@ -14,13 +14,17 @@ module IsoDoc
14
14
  page_break(out)
15
15
  iec_orgname(out)
16
16
  middle_title(isoxml, out)
17
- out.div **attr_code(id: f ? f["id"] : "") do |s|
17
+ foreword1(f, b, out)
18
+ end
19
+
20
+ def foreword1(sect, boilerplate, out)
21
+ out.div **attr_code(id: sect ? sect["id"] : "") do |s|
18
22
  s.h1(**{ class: "ForewordTitle" }) { |h1| h1 << @i18n.foreword }
19
23
  @meta.get[:doctype] == "Amendment" or
20
24
  s.div **attr_code(class: "boilerplate_legal") do |s1|
21
- b&.elements&.each { |e| parse(e, s1) }
25
+ boilerplate&.elements&.each { |e| parse(e, s1) }
22
26
  end
23
- f&.elements&.each { |e| parse(e, s) unless e.name == "title" }
27
+ sect&.elements&.each { |e| parse(e, s) unless e.name == "title" }
24
28
  end
25
29
  end
26
30
 
@@ -31,19 +35,11 @@ module IsoDoc
31
35
  end
32
36
 
33
37
  def middle_title(_isoxml, out)
34
- title1 = @meta.get[:doctitlemain]&.sub(/\s+$/, "")
35
- @meta.get[:doctitleintro] and
36
- title1 = "#{@meta.get[:doctitleintro]} &mdash; #{title1}"
37
- if @meta.get[:doctitlepart]
38
- title1 += " &mdash;"
39
- title2 = @meta.get[:doctitlepart]&.sub(/\s+$/, "")
40
- @meta.get[:doctitlepartlabel] and
41
- title2 = "#{@meta.get[:doctitlepartlabel]}: #{title2}"
42
- end
38
+ title1, title2 = middle_title_parts(out)
43
39
  out.p(**{ class: "zzSTDTitle1" }) do |p|
44
40
  p.b { |b| b << title1 }
45
41
  end
46
- if @meta.get[:doctitlepart]
42
+ if title2
47
43
  out.p(**{ class: "zzSTDTitle1" }) { |p| p << "&nbsp;" }
48
44
  out.p(**{ class: "zzSTDTitle2" }) do |p|
49
45
  p.b { |b| b << title2 }
@@ -52,6 +48,20 @@ module IsoDoc
52
48
  out.p(**{ class: "zzSTDTitle1" }) { |p| p << "&nbsp;" }
53
49
  end
54
50
 
51
+ def middle_title_parts(out)
52
+ title1 = @meta.get[:doctitlemain]&.sub(/\s+$/, "")
53
+ @meta.get[:doctitleintro] and
54
+ title1 = "#{@meta.get[:doctitleintro]} &mdash; #{title1}"
55
+ title2 = nil
56
+ if @meta.get[:doctitlepart]
57
+ title1 += " &mdash;"
58
+ title2 = @meta.get[:doctitlepart]&.sub(/\s+$/, "")
59
+ @meta.get[:doctitlepartlabel] and
60
+ title2 = "#{@meta.get[:doctitlepartlabel]}: #{title2}"
61
+ end
62
+ [title1, title2]
63
+ end
64
+
55
65
  def bibliography(isoxml, out)
56
66
  return super unless @is_iev
57
67
  end
@@ -80,54 +90,9 @@ module IsoDoc
80
90
  end
81
91
  end
82
92
 
83
- def termref_cleanup(docxml)
84
- return super unless @is_iev
85
-
86
- docxml
87
- .gsub(%r{\s*\[/TERMREF\]\s*</p>\s*<p>\s*\[TERMREF\]}, "; ")
88
- .gsub(/\[TERMREF\]\s*/, l10n("#{@i18n.source}: "))
89
- .gsub(/\s*\[MODIFICATION\]\s*\[\/TERMREF\]/,
90
- l10n(", #{@i18n.modified} [/TERMREF]"))
91
- .gsub(/\s*\[\/TERMREF\]\s*/, l10n(""))
92
- .gsub(/\s*\[MODIFICATION\]/, l10n(", #{@i18n.modified} &mdash; "))
93
- end
94
-
95
93
  def set_termdomain(termdomain)
96
94
  return super unless @is_iev
97
95
  end
98
-
99
- def term_suffix(node, out)
100
- return unless @is_iev
101
-
102
- domain = node&.at(ns("../domain"))&.text
103
- return unless domain
104
-
105
- out << ", &lt;#{domain}&gt;"
106
- end
107
-
108
- def deprecated_term_parse(node, out)
109
- out.p **{ class: "DeprecatedTerms", style: "text-align:left;" } do |p|
110
- p << l10n("#{@i18n.deprecated}: ")
111
- node.children.each { |c| parse(c, p) }
112
- term_suffix(node, p)
113
- end
114
- end
115
-
116
- def admitted_term_parse(node, out)
117
- out.p **{ class: "AltTerms", style: "text-align:left;" } do |p|
118
- node.children.each { |c| parse(c, p) }
119
- term_suffix(node, p)
120
- end
121
- end
122
-
123
- def term_parse(node, out)
124
- return super unless @is_iev
125
-
126
- out.p **{ class: "Terms", style: "text-align:left;" } do |p|
127
- node.children.each { |c| parse(c, p) }
128
- term_suffix(node, p)
129
- end
130
- end
131
96
  end
132
97
  end
133
98
  end
@@ -75,6 +75,12 @@ code *, pre *, tt *, kbd *, samp * {
75
75
  font-family: {{monospacefont}} !important;
76
76
  font-variant-ligatures: none; }
77
77
 
78
+ p code, dt code, li code, label code, legend code, caption code, th code, td code,
79
+ p tt, dt tt, li tt, label tt, legend tt, caption tt, th tt, td tt,
80
+ p kbd, dt kbd, li kbd, label kbd, legend kbd, caption kbd, th kbd, td kbd,
81
+ p samp, dt samp, li samp, label samp, legend samp, caption samp, th samp, td samp {
82
+ font-size: {{monospacefontsize}}; }
83
+
78
84
  article, aside, details, figcaption, figure,
79
85
  footer, header, hgroup, menu, nav, section {
80
86
  display: block; }
@@ -86,6 +92,9 @@ table {
86
92
  h1, h2, h3, h4, h5, h6 {
87
93
  font-family: {{headerfont}}; }
88
94
 
95
+ .h1, .h2, .h3, .h4, .h5, .h6 {
96
+ font-family: {{headerfont}}; }
97
+
89
98
  blockquote, q {
90
99
  quotes: none; }
91
100
  blockquote:before, blockquote:after, q:before, q:after {
@@ -298,19 +307,19 @@ span.partlabel {
298
307
  font-size: 0.9em; }
299
308
 
300
309
  /* TYPOGRAPHY */
301
- h1 {
310
+ h1, .h1 {
302
311
  font-size: 1.5em;
303
312
  line-height: 2em;
304
313
  margin-top: 2em;
305
314
  margin-bottom: 1em; }
306
315
 
307
- h2 {
316
+ h2, .h2 {
308
317
  font-size: 1.2em;
309
318
  line-height: 1.5em;
310
319
  margin-top: 2em;
311
320
  margin-bottom: 1em; }
312
321
 
313
- h1, h2, h3, h4, h5, h6 {
322
+ h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
314
323
  line-height: 1.2; }
315
324
 
316
325
  p {
@@ -337,7 +346,7 @@ nav a {
337
346
  text-decoration: none;
338
347
  color: black; }
339
348
 
340
- h2 p {
349
+ h2 p, .h2 p {
341
350
  display: inline; }
342
351
 
343
352
  ul > li {
@@ -365,9 +374,11 @@ p.AltTerms {
365
374
  margin-left: 2em; }
366
375
 
367
376
  p.Terms {
368
- font-weight: bold;
369
377
  margin-top: 0em; }
370
378
 
379
+ p.TermNum {
380
+ font-weight: bold; }
381
+
371
382
  /* Navigation*/
372
383
  @media screen and (min-width: 768px) {
373
384
  nav {
@@ -971,3 +982,24 @@ span.keyword {
971
982
 
972
983
  .Admonition p, .admonition p {
973
984
  margin: 0; }
985
+
986
+ /* Collapse TOC */
987
+ .collapse-group {
988
+ display: flex;
989
+ align-items: center;
990
+ position: relative; }
991
+
992
+ .collapse-button {
993
+ position: absolute;
994
+ right: 0;
995
+ display: inline-block;
996
+ height: 20px;
997
+ width: 20px;
998
+ cursor: pointer;
999
+ background-image: url('data:image/svg+xml,<svg focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="rgba(0,0,0,.54)" d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"></path></svg>'); }
1000
+
1001
+ .collapse {
1002
+ display: none; }
1003
+
1004
+ .expand {
1005
+ transform: rotateZ(-180deg); }