summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/optex/base/basic-macros.opm
blob: 4d465c30109ca72f0243d5386d5f1f424b088e65 (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
%% This is part of the OpTeX project, see http://petr.olsak.net/optex

\_codedecl \sdef {Basic macros for OpTeX <2021-02-03>} % loaded in format

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

\_let\_bgroup={  \_let\_egroup=}
\_def \_empty {}
\_def \_space { }
\_def \_null {\_hbox{}}
\_def \_wlog {\_immediate\_write-1 } % write on log file (only)
\_public \bgroup \egroup \empty \space \null \wlog ;

   \_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 \_csname#2\_endcsname}
\_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 \_tracinglostchars=1 \_tracingmacros=2
  \_tracingparagraphs=1 \_tracingrestores=1 \_tracingscantokens=1
  \_tracingifs=1 \_tracinggroups=1 \_tracingassigns=1 }
\_def\_tracingall{\_tracingonline=1 \_loggingall}
\_public \loggingall \tracingall ;

   \_doc ------------------------------
   Write a warning if the user did not load a Unicode Font {\em or}
   if there were unresolved references. \`\_byehook` is used in the \^`\bye` macro.
   \_cod ------------------------------

\_def\_byehook{%
   \_ifx\_initunifonts\_relax \_relax\_else \_opwarning{Unicode font was not loaded}\_fi
   \_ifnum\_unresolvedrefs>0 \_opwarning{Try to rerun to get references right}\_fi
}

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

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