summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/optex/base/basic-macros.opm
blob: 2e8c98d6e3ea18dd040b2c6e782a7402d7906d5f (plain)
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
129
130
131
132
133
134
135
136
137
138
139
%% This is part of the OpTeX project, see http://petr.olsak.net/optex

\_codedecl \sdef {Basic macros for OpTeX <2021-07-20>} % preloaded in format

   \_doc ------------------------------
   \`\bgroup`, \`\egroup`, \`\empty`, \`\space`, and \`\null`
   are classical macros from plain \TeX/.
   \_cod ------------------------------

\_let\_bgroup={  \_let\_egroup=}
\_def \_empty {}
\_def \_space { }
\_def \_null {\_hbox{}}
\_public \bgroup \egroup \empty \space \null ;

   \_doc ------------------------------
   \`\ignoreit` ignores next token or `{<text>}`,
   \`\useit``{<text>}` expands to `<text>` (removes outer braces),
   \`\ignoresecond` uses first, ignores second parameter and
   \`\usesecond` ignores first, uses second parameter.
   \_cod ------------------------------

\_long\_def \_ignoreit #1{}
\_long\_def \_useit #1{#1}
\_long\_def \_ignoresecond #1#2{#1}
\_long\_def \_usesecond #1#2{#2}
\_public \ignoreit \useit \ignoresecond \usesecond ;

   \_doc ------------------------------
   \`\bslash` is \"normal backslash" with category code 12.
   \`\nbb` is double backslash
   and \`\pcent` is normal~`%`.
   They can be used in Lua codes, for example.
   \_cod ------------------------------

\_edef \_bslash {\_csstring\\}
\_edef \_nbb {\_bslash\_bslash}
\_edef \_pcent{\_csstring\%}
\_public \bslash \nbb \pcent ;

   \_doc ------------------------------
   \`\sdef` `{<text>}` is equivalent to `\def\<text>`, where `\<text>` is a control
   sequence. You can use arbitrary parameter mask after `\sdef{<text>}`, don't
   put the (unwanted) space immediately after closing brace \code{\}}.
   \nl
   \`\sxdef` `{<text>}` is equivalent to `\xdef\<text>`.
   \nl
   \`\slet` `{<textA>}{<textB>}` is equivalent to `\let \<textA> = \<textB>`.
   \_cod ------------------------------

\_def \_sdef #1{\_ea\_def \_csname#1\_endcsname}
\_def \_sxdef #1{\_ea\_xdef \_csname#1\_endcsname}
\_def \_slet #1#2{\_ea\_let \_csname#1\_ea\_endcsname
   \_ifcsname#2\_ea\_endcsname \_begincsname#2\_endcsname \_else \_undefined \_fi
}
\_public \sdef \sxdef \slet ;

   \_doc ------------------------------
   \`\adef` `{<char>}{<body>}` puts the <char> as active character and defines it
   as `{<body>}`. You can declare a macro with parameters too. For example
   `\adef @#1{...#1...}`.
   \_cod ------------------------------

\_def \_adef #1{\_catcode`#1=13 \_begingroup \_lccode`\~=`#1\_lowercase{\_endgroup\_def~}}
\_public \adef ;

   \_doc ------------------------------
   \`\cs` `{<text>}` is only a shortcut to `\csname <text>\endcsname`, but you need
   one more `\_ea` if you need to get the real control sequence `\<text>`.
   \nl
   \`\trycs` `{<csname>}{<text>}` expands to `\<csname>`
   if it is defined else to the `<text>`.
   \_cod ------------------------------

\_def \_cs #1{\_csname#1\_endcsname}
\_def \_trycs#1#2{\_ifcsname #1\_endcsname \_csname #1\_ea\_endcsname \_else #2\_fi}
\_public \cs \trycs ;

   \_doc ------------------------------
   \`\addto` `\macro{<text>}` adds `<text>` to your `\macro`, which must be defined.
   \_cod ------------------------------

\_long\_def \_addto #1#2{\_ea\_def\_ea#1\_ea{#1#2}}
\_public \addto ;

   \_doc -----------------------------
   \`\incr``<counter>` increases `<counter>` by one globally.
   \`\decr``<counter>` decreases `<counter>` by one globally.
   \_cod -----------------------------

\_def\_incr #1{\_global\_advance#1by1 }
\_def\_decr #1{\_global\_advance#1by-1 }
\_public \incr \decr ;

   \_doc ------------------------------
   \`\opwarning` `{<text>}` prints warning on the terminal and to the log file.
   \_cod ------------------------------

\_def \_opwarning #1{\_wterm{WARNING l.\_the\_inputlineno: #1.}}
\_public \opwarning ;

   \_doc ------------------------------
   \`\loggingall` and \`\tracingall` are defined similarly as in
   plain \TeX/, but they print
   more logging information to the log file and the terminal.
   \_cod ------------------------------

\_def\_loggingall{\_tracingcommands=3 \_tracingstats=2 \_tracingpages=1
  \_tracingoutput=1 \_tracingmacros=3 % \_tracinglostchars=2 is already set
  \_tracingparagraphs=1 \_tracingrestores=1 \_tracingscantokens=1
  \_tracingifs=1 \_tracinggroups=1 \_tracingassigns=1 }
\_def\_tracingall{\_tracingonline=1 \_loggingall}
\_public \loggingall \tracingall ;

   \_doc ------------------------------
   \`\_byehook` is used in the \^`\bye` macro.
   Write a warning if the user did not load a Unicode Font.
   Write a \"rerun" warning if the `.ref` file was newly created or it was
   changed (compared to the previous TeX run).
   \_cod ------------------------------

\_def\_byehook{%
   \_ifx\_initunifonts\_relax \_relax\_else \_opwarning{Unicode font was not loaded}\_fi
   \_immediate\_closeout\_reffile
   \_edef\_tmp{\_mdfive{\_jobname.ref}}%
   \_ifx\_tmp\_prevrefhash\_else \_opwarning{Try to rerun,
      \_jobname.ref file was \_ifx\_prevrefhash\_empty created\_else changed\_fi}\_fi
}

\_endcode % -------------------------------------

2021-07-20: \_unresovedrefs removed from \_byehook
2021-07-18: \_byehook: checking `ref` file consistency added.
2021-05-16: \slet reimplemented (to allow \slet{foo}{undefined}).
2021-02-03: \useit defined.
2021-01-22: \trycs: \ea added in order to be able to use cs with parameters
2021-01-08: \opwarning format changed (secondly, hope that conclusively)
2020-10-12: \opwarning: line numbers added
2020-02-14: introduced