summaryrefslogtreecommitdiff
path: root/fonts/fdsymbol/source
diff options
context:
space:
mode:
Diffstat (limited to 'fonts/fdsymbol/source')
-rw-r--r--fonts/fdsymbol/source/FdSymbolA-Bold.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolA-Book.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolA-Medium.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolA-Regular.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolA.mf36
-rw-r--r--fonts/fdsymbol/source/FdSymbolB-Bold.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolB-Book.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolB-Medium.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolB-Regular.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolB.mf20
-rw-r--r--fonts/fdsymbol/source/FdSymbolC-Bold.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolC-Book.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolC-Medium.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolC-Regular.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolC.mf20
-rw-r--r--fonts/fdsymbol/source/FdSymbolD-Bold.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolD-Book.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolD-Medium.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolD-Regular.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolD.mf20
-rw-r--r--fonts/fdsymbol/source/FdSymbolE-Bold.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolE-Book.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolE-Medium.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolE-Regular.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolE.mf25
-rw-r--r--fonts/fdsymbol/source/FdSymbolF-Bold.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolF-Book.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolF-Medium.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolF-Regular.mf15
-rw-r--r--fonts/fdsymbol/source/FdSymbolF.mf12
-rw-r--r--fonts/fdsymbol/source/fdaccents.mf89
-rw-r--r--fonts/fdsymbol/source/fdarrows.mf805
-rw-r--r--fonts/fdsymbol/source/fdbase.mf956
-rw-r--r--fonts/fdsymbol/source/fddelims.mf601
-rw-r--r--fonts/fdsymbol/source/fdgeometric.mf1875
-rw-r--r--fonts/fdsymbol/source/fdoperators.mf457
-rw-r--r--fonts/fdsymbol/source/fdrelations.mf1151
-rw-r--r--fonts/fdsymbol/source/fdturnstile.mf102
38 files changed, 6529 insertions, 0 deletions
diff --git a/fonts/fdsymbol/source/FdSymbolA-Bold.mf b/fonts/fdsymbol/source/FdSymbolA-Bold.mf
new file mode 100644
index 0000000000..d1b292227e
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolA-Bold.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolA";
+ font_weight := "Bold";
+fi
+weight_index := 3;
+
+input FdSymbolA;
diff --git a/fonts/fdsymbol/source/FdSymbolA-Book.mf b/fonts/fdsymbol/source/FdSymbolA-Book.mf
new file mode 100644
index 0000000000..3d4ba4e5fd
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolA-Book.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolA";
+ font_weight := "Book";
+fi
+weight_index := 0;
+
+input FdSymbolA;
diff --git a/fonts/fdsymbol/source/FdSymbolA-Medium.mf b/fonts/fdsymbol/source/FdSymbolA-Medium.mf
new file mode 100644
index 0000000000..a255885a72
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolA-Medium.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolA";
+ font_weight := "Medium";
+fi
+weight_index := 2;
+
+input FdSymbolA;
diff --git a/fonts/fdsymbol/source/FdSymbolA-Regular.mf b/fonts/fdsymbol/source/FdSymbolA-Regular.mf
new file mode 100644
index 0000000000..d17223fea3
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolA-Regular.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolA";
+ font_weight := "Regular";
+fi
+weight_index := 1;
+
+input FdSymbolA;
diff --git a/fonts/fdsymbol/source/FdSymbolA.mf b/fonts/fdsymbol/source/FdSymbolA.mf
new file mode 100644
index 0000000000..0e0f741358
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolA.mf
@@ -0,0 +1,36 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+input fdbase;
+input fdgeometric;
+
+font_slant 0;
+font_x_height x_height#;
+font_quad 10pt#;
+
+subs := 7/10; % subscript size
+rth# := rule_thickness#;
+
+fontdimen 8: % parameters $\sigma_8$ to $\sigma_{22}$ will now be listed
+ math_axis# + 3.5rth# + desc_depth#, % num1 (\sigma_8)
+ math_axis# + 1.5rth# + 5/6pt#, % num2 (\sigma_9)
+ math_axis# + 1.5rth# + 5/6pt#, % num3 (\sigma_{10})
+ 3.5rth# + subs * asc_height# - math_axis#, % denom1 (\sigma_{11})
+ 1.5rth# + subs * asc_height# - math_axis# + 5/6pt#, % denom2 (\sigma_{12})
+ 5.5pt#, % sup1 (\sigma_{13})
+ 5.2pt#, % sup2 (\sigma_{14})
+ 3.7pt#, % sup3 (\sigma_{15})
+ 1.8pt#, % sub1 (\sigma_{16})
+ 2.0pt#, % sub2 (\sigma_{17})
+ 4.0pt#, % sup\_drop (\sigma_{18})
+ 0.5pt#, % sub\_drop (\sigma_{19})
+ 25pt#, % delim1 (\sigma_{20})
+ 12pt#, % delim2 (\sigma_{21})
+ math_axis#; % axis\_height (\sigma_{22})
+
+bye;
diff --git a/fonts/fdsymbol/source/FdSymbolB-Bold.mf b/fonts/fdsymbol/source/FdSymbolB-Bold.mf
new file mode 100644
index 0000000000..dfed9f6e51
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolB-Bold.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolB";
+ font_weight := "Bold";
+fi
+weight_index := 3;
+
+input FdSymbolB;
diff --git a/fonts/fdsymbol/source/FdSymbolB-Book.mf b/fonts/fdsymbol/source/FdSymbolB-Book.mf
new file mode 100644
index 0000000000..a49fb64032
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolB-Book.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolB";
+ font_weight := "Book";
+fi
+weight_index := 0;
+
+input FdSymbolB;
diff --git a/fonts/fdsymbol/source/FdSymbolB-Medium.mf b/fonts/fdsymbol/source/FdSymbolB-Medium.mf
new file mode 100644
index 0000000000..5a96e1ef52
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolB-Medium.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolB";
+ font_weight := "Medium";
+fi
+weight_index := 2;
+
+input FdSymbolB;
diff --git a/fonts/fdsymbol/source/FdSymbolB-Regular.mf b/fonts/fdsymbol/source/FdSymbolB-Regular.mf
new file mode 100644
index 0000000000..eb9cef8244
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolB-Regular.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolB";
+ font_weight := "Regular";
+fi
+weight_index := 1;
+
+input FdSymbolB;
diff --git a/fonts/fdsymbol/source/FdSymbolB.mf b/fonts/fdsymbol/source/FdSymbolB.mf
new file mode 100644
index 0000000000..3307772796
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolB.mf
@@ -0,0 +1,20 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+input fdbase;
+
+negated := 0;
+input fdrelations;
+
+negated := 1;
+input fdrelations;
+
+negated := 2;
+input fdrelations;
+
+bye;
diff --git a/fonts/fdsymbol/source/FdSymbolC-Bold.mf b/fonts/fdsymbol/source/FdSymbolC-Bold.mf
new file mode 100644
index 0000000000..9850fb6ece
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolC-Bold.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolC";
+ font_weight := "Bold";
+fi
+weight_index := 3;
+
+input FdSymbolC;
diff --git a/fonts/fdsymbol/source/FdSymbolC-Book.mf b/fonts/fdsymbol/source/FdSymbolC-Book.mf
new file mode 100644
index 0000000000..156cccd095
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolC-Book.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolC";
+ font_weight := "Book";
+fi
+weight_index := 0;
+
+input FdSymbolC;
diff --git a/fonts/fdsymbol/source/FdSymbolC-Medium.mf b/fonts/fdsymbol/source/FdSymbolC-Medium.mf
new file mode 100644
index 0000000000..486b771dad
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolC-Medium.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolC";
+ font_weight := "Medium";
+fi
+weight_index := 2;
+
+input FdSymbolC;
diff --git a/fonts/fdsymbol/source/FdSymbolC-Regular.mf b/fonts/fdsymbol/source/FdSymbolC-Regular.mf
new file mode 100644
index 0000000000..e468cbd50c
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolC-Regular.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolC";
+ font_weight := "Regular";
+fi
+weight_index := 1;
+
+input FdSymbolC;
diff --git a/fonts/fdsymbol/source/FdSymbolC.mf b/fonts/fdsymbol/source/FdSymbolC.mf
new file mode 100644
index 0000000000..bac71ba820
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolC.mf
@@ -0,0 +1,20 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+input fdbase;
+
+boolean negated;
+negated := false;
+
+input fdarrows;
+
+current_char := 223;
+
+input fdturnstile;
+
+bye;
diff --git a/fonts/fdsymbol/source/FdSymbolD-Bold.mf b/fonts/fdsymbol/source/FdSymbolD-Bold.mf
new file mode 100644
index 0000000000..a9750a7a40
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolD-Bold.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolD";
+ font_weight := "Bold";
+fi
+weight_index := 3;
+
+input FdSymbolD;
diff --git a/fonts/fdsymbol/source/FdSymbolD-Book.mf b/fonts/fdsymbol/source/FdSymbolD-Book.mf
new file mode 100644
index 0000000000..f2d6bba7e6
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolD-Book.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolD";
+ font_weight := "Book";
+fi
+weight_index := 0;
+
+input FdSymbolD;
diff --git a/fonts/fdsymbol/source/FdSymbolD-Medium.mf b/fonts/fdsymbol/source/FdSymbolD-Medium.mf
new file mode 100644
index 0000000000..d8c7b6ef6c
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolD-Medium.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolD";
+ font_weight := "Medium";
+fi
+weight_index := 2;
+
+input FdSymbolD;
diff --git a/fonts/fdsymbol/source/FdSymbolD-Regular.mf b/fonts/fdsymbol/source/FdSymbolD-Regular.mf
new file mode 100644
index 0000000000..8544b9f01a
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolD-Regular.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolD";
+ font_weight := "Regular";
+fi
+weight_index := 1;
+
+input FdSymbolD;
diff --git a/fonts/fdsymbol/source/FdSymbolD.mf b/fonts/fdsymbol/source/FdSymbolD.mf
new file mode 100644
index 0000000000..026d6459e2
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolD.mf
@@ -0,0 +1,20 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+input fdbase;
+
+boolean negated;
+negated := true;
+
+input fdarrows;
+
+current_char := 223;
+
+input fdturnstile;
+
+bye;
diff --git a/fonts/fdsymbol/source/FdSymbolE-Bold.mf b/fonts/fdsymbol/source/FdSymbolE-Bold.mf
new file mode 100644
index 0000000000..4f35fb7fe0
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolE-Bold.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolE";
+ font_weight := "Bold";
+fi
+weight_index := 3;
+
+input FdSymbolE;
diff --git a/fonts/fdsymbol/source/FdSymbolE-Book.mf b/fonts/fdsymbol/source/FdSymbolE-Book.mf
new file mode 100644
index 0000000000..5b0c726a67
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolE-Book.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolE";
+ font_weight := "Book";
+fi
+weight_index := 0;
+
+input FdSymbolE;
diff --git a/fonts/fdsymbol/source/FdSymbolE-Medium.mf b/fonts/fdsymbol/source/FdSymbolE-Medium.mf
new file mode 100644
index 0000000000..b5cf4f2681
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolE-Medium.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolE";
+ font_weight := "Medium";
+fi
+weight_index := 2;
+
+input FdSymbolE;
diff --git a/fonts/fdsymbol/source/FdSymbolE-Regular.mf b/fonts/fdsymbol/source/FdSymbolE-Regular.mf
new file mode 100644
index 0000000000..bc50ab65c6
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolE-Regular.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolE";
+ font_weight := "Regular";
+fi
+weight_index := 1;
+
+input FdSymbolE;
diff --git a/fonts/fdsymbol/source/FdSymbolE.mf b/fonts/fdsymbol/source/FdSymbolE.mf
new file mode 100644
index 0000000000..4d450ae861
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolE.mf
@@ -0,0 +1,25 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+input fdbase;
+input fdoperators;
+
+current_char := 113;
+input fdaccents.mf;
+
+font_x_height x_height#;
+
+fontdimen 8:
+ rule_thickness#, % default_rule_thickness
+ 1.1pt#, % big_op_spacing1
+ 1.6pt#, % big_op_spacing2
+ 2.0pt#, % big_op_spacing3
+ 6.0pt#, % big_op_spacing4
+ 1.0pt#; % big_op_spacing5
+
+bye;
diff --git a/fonts/fdsymbol/source/FdSymbolF-Bold.mf b/fonts/fdsymbol/source/FdSymbolF-Bold.mf
new file mode 100644
index 0000000000..27d9381857
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolF-Bold.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolF";
+ font_weight := "Bold";
+fi
+weight_index := 3;
+
+input FdSymbolF;
diff --git a/fonts/fdsymbol/source/FdSymbolF-Book.mf b/fonts/fdsymbol/source/FdSymbolF-Book.mf
new file mode 100644
index 0000000000..5ecb076c20
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolF-Book.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolF";
+ font_weight := "Book";
+fi
+weight_index := 0;
+
+input FdSymbolF;
diff --git a/fonts/fdsymbol/source/FdSymbolF-Medium.mf b/fonts/fdsymbol/source/FdSymbolF-Medium.mf
new file mode 100644
index 0000000000..b803435033
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolF-Medium.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolF";
+ font_weight := "Medium";
+fi
+weight_index := 2;
+
+input FdSymbolF;
diff --git a/fonts/fdsymbol/source/FdSymbolF-Regular.mf b/fonts/fdsymbol/source/FdSymbolF-Regular.mf
new file mode 100644
index 0000000000..ebe9712275
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolF-Regular.mf
@@ -0,0 +1,15 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+if known ps_output:
+ font_family := "FdSymbolF";
+ font_weight := "Regular";
+fi
+weight_index := 1;
+
+input FdSymbolF;
diff --git a/fonts/fdsymbol/source/FdSymbolF.mf b/fonts/fdsymbol/source/FdSymbolF.mf
new file mode 100644
index 0000000000..9d83d367f0
--- /dev/null
+++ b/fonts/fdsymbol/source/FdSymbolF.mf
@@ -0,0 +1,12 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+input fdbase;
+input fddelims;
+
+bye;
diff --git a/fonts/fdsymbol/source/fdaccents.mf b/fonts/fdsymbol/source/fdaccents.mf
new file mode 100644
index 0000000000..037ffb6a03
--- /dev/null
+++ b/fonts/fdsymbol/source/fdaccents.mf
@@ -0,0 +1,89 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+for scale = 1, 1.8, 2.6, 3.4, 4.2, 5:
+ beginsymbol(scale * 7u#, x_height# + 2rule_thickness# + 1/2equal_spread# + line_thickness#, 0); "wide hat";
+ thick := line_thickness;
+
+ y2 = h - 1/2thick;
+ x2 = w/2;
+ x1 = w - x3 = 0;
+ y1 = y3 = y2 - 1/2equal_spread;
+
+ theta := angle(z2 - z1);
+
+ penpos2(6/5thick, 90);
+ penpos1(thick, theta + 90);
+ penpos3(thick, 90 - theta);
+
+ fill stroke z1e -- z2e -- z3e;
+ endchar;
+endfor;
+
+charlist current_char - 5: current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char;
+
+for scale = 1, 1.8, 2.6, 3.4, 4.2, 5:
+ beginsymbol(scale * 7u#, x_height# + 2rule_thickness# + 1/2equal_spread# + line_thickness#, 0); "wide tilde";
+ draw_sim(a, (0, 1/2[x_height + 2rule_thickness, h]), (w, 1/2[x_height + 2rule_thickness, h]), 1/4equal_spread, line_thickness);
+ endchar;
+endfor;
+
+charlist current_char - 5: current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char;
+
+for scale = 1, 1.8, 2.6, 3.4, 4.2, 5:
+ beginsymbol(scale * 7u#, x_height# + 2rule_thickness# + 1/2equal_spread# + line_thickness#, 0); "wide paren";
+ draw_smile(a, -1, (0, 1/2[x_height + 2rule_thickness, h]), (w, 1/2[x_height + 2rule_thickness, h]), 1/2equal_spread, line_thickness, true);
+ endchar;
+endfor;
+
+charlist current_char - 5: current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char;
+
+beginsymbol(6u# + side_bearing#, x_height# + 2rule_thickness# + 5/2line_thickness#, 0); "vec";
+ thick := 3/4line_thickness;
+
+ x0 = side_bearing;
+ x1 = w - 1/2thick;
+ y0 = y1 = h - 5/4line_thickness;
+
+ draw_straight(z0, z1, thick, false);
+ draw_arrowhead(z1, 0, 5/2line_thickness, thick);
+endchar;
+
+beginsymbol(5u#, (-1)[x_height#, asc_height#], 0); "middle bar";
+ penpos0(5/6line_thickness, 85);
+ penpos1(5/6line_thickness, 85);
+
+ x0 = w - x1 = 0;
+ y0 = y1 = h;
+
+ fill stroke z0e -- z1e;
+endchar;
+
+beginsymbol(5u#, (-1)[x_height#, asc_height#], 0); "middle slash";
+ penpos0(line_thickness, 85);
+ penpos1(line_thickness, 85);
+
+ x0 = w - x1 = 0;
+ 1/2[y0,y1] = h;
+ y1 - y0 = 2line_thickness;
+
+ fill stroke z0e -- z1e;
+endchar;
+
+beginsymbol(5u# + 2side_bearing#, 3/2asc_height#, 0); "stroke through";
+ theta := 70;
+
+ penpos1(line_thickness, theta - 90);
+ penpos2(line_thickness, theta - 90);
+
+ z0 = (w/2,1/6asc_height);
+ z1 = z0 + 3/4asc_height / cosd (90 - theta) * dir theta;
+ z2 = z0 - 3/4asc_height / cosd (90 - theta) * dir theta;
+
+ fill stroke z1e -- z2e;
+endchar;
diff --git a/fonts/fdsymbol/source/fdarrows.mf b/fonts/fdsymbol/source/fdarrows.mf
new file mode 100644
index 0000000000..eb8f57b9c1
--- /dev/null
+++ b/fonts/fdsymbol/source/fdarrows.mf
@@ -0,0 +1,805 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+def ifneg(expr a,b) =
+ if negated: a else: b fi
+enddef;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#); "single arrow (" & decimal alpha & ")";
+ draw_line(foot_ex, head, false);
+ draw_arrowhead(head, alpha, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 1/2arrow_spread * dir alpha], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 6/5, ifneg(19/10, 13/10) * arrow_spread#); "double arrow (" & decimal alpha & ")";
+ z1 - z0 = z3 - z2 = equal_spread * dir (alpha + 90);
+ 1/2[z0,z1] = foot_ex;
+ 1/2[z2,z3] = head;
+
+ draw_line(z0, arrowhead_intersection(head, alpha, 13/10arrow_spread, z0 -- z2), false);
+ draw_line(z1, arrowhead_intersection(head, alpha, 13/10arrow_spread, z1 -- z3), false);
+ draw_arrowhead(head, alpha, 13/10arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - arrow_spread * dir alpha], alpha, 19/10arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 45, 135:
+ beginarrow(alpha, 6/5, ifneg(3/2, 1) * arrow_spread#); "bidirectional arrow (" & decimal alpha & ")";
+ draw_line(foot, head, false);
+ draw_arrowhead(head, alpha, arrow_spread, line_thickness);
+ draw_arrowhead(foot, alpha+180, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 45, 135:
+ beginarrow(alpha, 7/5, ifneg(19/10, 13/10) * arrow_spread#); "double bidirectional arrow (" & decimal alpha & ")";
+ z1 - z0 = z3 - z2 = equal_spread * dir (alpha + 90);
+ 1/2[z0,z1] = foot;
+ 1/2[z2,z3] = head;
+
+ draw_line(arrowhead_intersection(foot, alpha+180, 13/10arrow_spread, z0 -- z2), arrowhead_intersection(head, alpha, 13/10arrow_spread, z0 -- z2), false);
+ draw_line(arrowhead_intersection(foot, alpha+180, 13/10arrow_spread, z1 -- z3), arrowhead_intersection(head, alpha, 13/10arrow_spread, z1 -- z3), false);
+ draw_arrowhead(head, alpha, 13/10arrow_spread, line_thickness);
+ draw_arrowhead(foot, alpha+180, 13/10arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 19/10arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 5/4, ifneg(3/2, 1) * arrow_spread#); "double-head arrow (" & decimal alpha & ")";
+ draw_line(foot_ex, head, false);
+ draw_arrowhead(head, alpha, arrow_spread, line_thickness);
+ draw_arrowhead(head - 1/4arrow_len * dir alpha, alpha, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - (1/2arrow_spread + 1/4arrow_len) * dir alpha], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#); "tailed arrow (" & decimal alpha & ")";
+ z0 = foot + 1/2arrow_spread * dir alpha;
+
+ draw_line(z0, head, false);
+ draw_arrowhead(head, alpha, arrow_spread, line_thickness);
+ draw_arrowhead(z0, alpha, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#); "arrow with foot (" & decimal alpha & ")";
+ draw_line(foot, head, false);
+ draw_line(foot - 1/2arrow_spread * dir (alpha + 90), foot + 1/2arrow_spread * dir (alpha + 90), true);
+ draw_arrowhead(head, alpha, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 1/2arrow_spread * dir alpha], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginarrow(alpha, 6/5, ifneg(19/10, 13/10) * arrow_spread#); "double arrow with foot (" & decimal alpha & ")";
+ z1 - z0 = z3 - z2 = equal_spread * dir (alpha + 90);
+ 1/2[z0,z1] = foot_ex;
+ 1/2[z2,z3] = head;
+
+ draw_line(z0, arrowhead_intersection(head, alpha, 13/10arrow_spread, z0 -- z2), false);
+ draw_line(z1, arrowhead_intersection(head, alpha, 13/10arrow_spread, z1 -- z3), false);
+ draw_line(foot - 13/20arrow_spread * dir (alpha + 90), foot + 13/20arrow_spread * dir (alpha + 90), true);
+ draw_arrowhead(head, alpha, 13/10arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 1/2arrow_spread * dir alpha], alpha, 19/10arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#); "left embedding (" & decimal alpha & ")";
+ thick := line_thickness;
+
+ z0 = foot + 1/4arrow_spread * dir(alpha + 90);
+ 1/2[z1,z2] = z0 + 1/4arrow_spread * dir alpha;
+ z2 = z1 + 1/2arrow_spread * dir (alpha + 90);
+ z3 = head;
+ z4 = z2 + 1/2thick * dir alpha;
+
+ penpos0(thick, alpha);
+ penpos1(thick, alpha + 90);
+ penpos2(thick, alpha - 90);
+ penpos3(thick, alpha + 90);
+ penpos4(thick, alpha - 90);
+
+ draw_arrowhead(head, alpha, arrow_spread, thick);
+ fill stroke z4.e -- z2.e{dir (alpha + 180)} ..
+ z0.e{dir (alpha - 90)} .. z1.e{dir alpha} -- z3.e;
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 1/2arrow_spread * dir alpha], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#); "right embedding (" & decimal alpha & ")";
+ thick := line_thickness;
+
+ z0 = foot - 1/4arrow_spread * dir(alpha + 90);
+ 1/2[z1,z2] = z0 + 1/4arrow_spread * dir alpha;
+ z2 = z1 - 1/2arrow_spread * dir (alpha + 90);
+ z3 = head;
+ z4 = z2 + 1/2thick * dir alpha;
+
+ penpos0(thick, alpha + 180);
+ penpos1(thick, alpha + 90);
+ penpos2(thick, alpha - 90);
+ penpos3(thick, alpha + 90);
+ penpos4(thick, alpha - 90);
+
+ draw_arrowhead(head, alpha, arrow_spread, thick);
+ fill stroke z4.e -- z2.e{dir (alpha + 180)} ..
+ z0.e{dir (alpha + 90)} .. z1.e{dir alpha} -- z3.e;
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 1/2arrow_spread * dir alpha], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#); "left harpoon (" & decimal alpha & ")";
+ draw_line(foot_ex, head, false);
+ draw_arrowhead_left(head, alpha, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 1/2arrow_spread * dir alpha], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#); "right harpoon (" & decimal alpha & ")";
+ draw_line(foot_ex, head, false);
+ draw_arrowhead_right(head, alpha, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 1/2arrow_spread * dir alpha], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 45, 135:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#); "left left harpoon (" & decimal alpha & ")";
+ draw_line(foot, head, false);
+ draw_arrowhead_left(head, alpha, arrow_spread, line_thickness);
+ draw_arrowhead_left(foot, alpha+180, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 3/2arrow_spread)(80, 80, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 45, 135:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#); "right right harpoon (" & decimal alpha & ")";
+ draw_line(foot, head, false);
+ draw_arrowhead_right(head, alpha, arrow_spread, line_thickness);
+ draw_arrowhead_right(foot, alpha+180, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 3/2arrow_spread)(70, 70, 100, 100);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 45, 135:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread# + equal_spread#); "double left left harpoon (" & decimal alpha & ")";
+ z1 - z0 = z1' - z0' = z3 - z2 = z3' - z2' = equal_spread * dir (alpha + 90);
+ 1/2[z0,z1] = foot;
+ 1/2[z0',z1'] = foot_ex;
+ 1/2[z2,z3] = head;
+ 1/2[z2',z3'] = head_ex;
+
+ draw_line(z2', z0, false);
+ draw_line(z1', z3, false);
+ draw_arrowhead_left(z3, alpha, arrow_spread, line_thickness);
+ draw_arrowhead_left(z0, alpha+180, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 3/2arrow_spread + equal_spread)(80, 80, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 45, 135:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread# + equal_spread#); "double right right harpoon (" & decimal alpha & ")";
+ z1 - z0 = z1' - z0' = z3 - z2 = z3' - z2' = equal_spread * dir (alpha + 90);
+ 1/2[z0,z1] = foot;
+ 1/2[z0',z1'] = foot_ex;
+ 1/2[z2,z3] = head;
+ 1/2[z2',z3'] = head_ex;
+
+ draw_line(z0', z2, false);
+ draw_line(z3', z1, false);
+ draw_arrowhead_right(z2, alpha, arrow_spread, line_thickness);
+ draw_arrowhead_right(z1, alpha+180, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 3/2arrow_spread + equal_spread)(70, 70, 100, 100);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#); "broken arrow (" & decimal alpha & ")";
+ z0 = ifneg( 4/20, 6/20)[foot,head];
+ z1 = ifneg(13/20,11/20)[foot,head];
+
+ draw_line(foot_ex, z0, false);
+ draw_line(z1, head, false);
+ draw_arrowhead(head, alpha, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[z0, z1], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#); "multi map (" & decimal alpha & ")";
+ draw_line(foot_ex, head - (4/5arrow_spread + 1/4line_thickness) * dir alpha, false);
+ draw_circle(head - 2/5arrow_spread * dir alpha, 2/5arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 4/5arrow_spread * dir alpha], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#); "filled multi map (" & decimal alpha & ")";
+ draw_line(foot_ex, head_ex - 2/5arrow_spread * dir alpha, false);
+ filldraw_circle(head - 2/5arrow_spread * dir alpha, 2/5arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 4/5arrow_spread * dir alpha], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+beginarrow(0, 7/5, ifneg(3/2, 1) * arrow_spread#); "double multi map";
+ draw_line(foot + (4/5arrow_spread + 1/4line_thickness) * right, head - (4/5arrow_spread + 1/4line_thickness) * right, false);
+ draw_circle(head - 2/5arrow_spread * right, 2/5arrow_spread, line_thickness);
+ draw_circle(foot + 2/5arrow_spread * right, 2/5arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], 0, 3/2arrow_spread)(70);
+ fi
+endchar;
+
+beginarrow(0, 7/5, ifneg(3/2, 1) * arrow_spread#); "filled double multi map";
+ draw_line(foot_ex + 2/5arrow_spread * right, head - 2/5arrow_spread * right, false);
+ filldraw_circle(head - 2/5arrow_spread * right, 2/5arrow_spread, line_thickness);
+ filldraw_circle(foot + 2/5arrow_spread * right, 2/5arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], 0, 3/2arrow_spread)(70);
+ fi
+endchar;
+
+for alpha = 0, 180:
+ beginarrow(alpha, 7/5, ifneg(3/2, 1) * arrow_spread#); "image of (" & decimal alpha & ")";
+ draw_line(foot_ex + 2/5arrow_spread * dir alpha, head - (4/5arrow_spread + 1/4line_thickness) * dir alpha, false);
+ filldraw_circle(foot + 2/5arrow_spread * dir alpha, 2/5arrow_spread, line_thickness);
+ draw_circle(head - 2/5arrow_spread * dir alpha, 2/5arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginarrow(alpha, 1, 3/4plus_size# + ifneg(1,0) * arrow_spread#); "pitchfork (" & decimal alpha & ")";
+ draw_line(foot_ex, head_ex, false);
+ draw_subset(a, foot + 1/2arrow_len * dir alpha, foot_ex, 3/4plus_size, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/4[foot, head], alpha, 3/4plus_size + arrow_spread)(80, 80, 100, 100, 80, 80, 100, 100);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 1, 2arrow_spread#); "parallel arrows (" & decimal alpha & ")";
+ z1 - z0 = z3 - z2 = arrow_spread * dir (alpha + 90);
+ 1/2[z0,z1] = foot_ex;
+ 1/2[z2,z3] = head;
+
+ draw_line(z0, z2, false);
+ draw_line(z1, z3, false);
+ draw_arrowhead(z2, alpha, arrow_spread, line_thickness);
+ draw_arrowhead(z3, alpha, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 1/2arrow_spread * dir alpha], alpha, 2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 45, 135:
+ beginarrow(alpha, 1, 2arrow_spread#); "anti-parallel arrows right left (" & decimal alpha & ")";
+ z1 - z0 = z1' - z0' = z3 - z2 = z3' - z2' = arrow_spread * dir (alpha + 90);
+ 1/2[z0,z1] = foot;
+ 1/2[z0',z1'] = foot_ex;
+ 1/2[z2,z3] = head;
+ 1/2[z2',z3'] = head_ex;
+
+ draw_line(z2', z0, false);
+ draw_line(z1', z3, false);
+ draw_arrowhead(z3, alpha, arrow_spread, line_thickness);
+ draw_arrowhead(z0, alpha+180, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 2arrow_spread)(80, 80, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 45, 135:
+ beginarrow(alpha, 1, 2arrow_spread#); "anti-parallel arrows left right (" & decimal alpha & ")";
+ z1 - z0 = z1' - z0' = z3 - z2 = z3' - z2' = arrow_spread * dir (alpha + 90);
+ 1/2[z0,z1] = foot;
+ 1/2[z0',z1'] = foot_ex;
+ 1/2[z2,z3] = head;
+ 1/2[z2',z3'] = head_ex;
+
+ draw_line(z0', z2, false);
+ draw_line(z3', z1, false);
+ draw_arrowhead(z2, alpha, arrow_spread, line_thickness);
+ draw_arrowhead(z1, alpha+180, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 2arrow_spread)(70, 70, 100, 100);
+ fi
+ endchar;
+endfor;
+
+for sign = 1, -1:
+for alpha = 0, 90, 180, 270:
+ beginarrow(alpha, 1, ifneg(3/2, 1) * arrow_spread#);
+ if sign > 0: "left right" else: "right left" fi & " wave arrow (" & decimal alpha & ")";
+ thick := line_thickness;
+
+ z0 = foot - sign * 1/8arrow_spread * dir (alpha + 90);
+ z1 = 4/18[foot,head] + sign * 1/4arrow_spread * dir (alpha + 90);
+ z2 = 7/18[foot,head];
+ z3 = 10/18[foot,head] - sign * 1/4arrow_spread * dir (alpha + 90);
+ z4 = 12/18[foot,head] - sign * 1/8arrow_spread * dir (alpha + 90);
+ z5 = 14/18[foot,head];
+ z6 = head;
+
+ penpos0(thick, alpha - 90 + sign * 55);
+ penpos1(thick, alpha - 90);
+ penpos2(thick, alpha - 90 - sign * 55);
+ penpos3(thick, alpha - 90);
+ penpos4(thick, alpha - 90 + sign * 35);
+ penpos5(thick, alpha - 90);
+ penpos6(thick, alpha - 90);
+
+ penlabels(0,1,2,3,4,5,6);
+
+ fill stroke z0.e{dir (alpha + sign * 55)} .. z1.e{dir alpha} .. z2.e{dir (alpha - sign * 55)} .. z3.e{dir alpha} .. z4.e{dir (alpha + sign * 35)} ... {dir alpha}z5.e -- z6.e;
+ draw_arrowhead(z6, alpha, arrow_spread, thick);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 1/2arrow_spread * dir alpha], alpha, 3/2arrow_spread)(70, 70, 70, 70, 70, 70, 70, 70);
+ fi
+ endchar;
+endfor;
+endfor;
+
+for sign = 1, -1:
+ for alpha = 0, 90:
+ beginarrow(alpha, 6/5, ifneg(3/2, 1) * arrow_spread#);
+ if sign > 0: "left right" else: "right left" fi & " bidirectional wave arrow (" & decimal alpha & ")";
+ thick := line_thickness;
+
+ z0 = foot;
+ z1 = 4/22[foot,head];
+ z2 = 6/22[foot,head] + sign * 1/8arrow_spread * dir (alpha + 90);
+ z3 = 8/22[foot,head] + sign * 1/4arrow_spread * dir (alpha + 90);
+ z4 = 11/22[foot,head];
+ z5 = 14/22[foot,head] - sign * 1/4arrow_spread * dir (alpha + 90);
+ z6 = 16/22[foot,head] - sign * 1/8arrow_spread * dir (alpha + 90);
+ z7 = 18/22[foot,head];
+ z8 = head;
+
+ penpos0(thick, alpha - 90);
+ penpos1(thick, alpha - 90);
+ penpos2(thick, alpha - 90 + sign * 35);
+ penpos3(thick, alpha - 90);
+ penpos4(thick, alpha - 90 - sign * 55);
+ penpos5(thick, alpha - 90);
+ penpos6(thick, alpha - 90 + sign * 35);
+ penpos7(thick, alpha - 90);
+ penpos8(thick, alpha - 90);
+
+ penlabels(0,1,2,3,4,5,6,7,8);
+
+ fill stroke z0e. -- z1.e{dir alpha} .. z2.e{dir (alpha + sign * 35)} .. z3.e{dir alpha} .. z4.e{dir (alpha - sign * 55)} .. z5.e{dir alpha} ... z6.e{dir (alpha + sign * 35)} .. {dir alpha}z7.e -- z8.e;
+ draw_arrowhead(z0, alpha + 180, arrow_spread, thick);
+ draw_arrowhead(z8, alpha, arrow_spread, thick);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 3/2arrow_spread)(70, 70, 70, 70);
+ fi
+ endchar;
+ endfor;
+endfor;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 1, ifneg(3/2,1) * arrow_spread#); "right bend arrow (" & decimal alpha & ")";
+ thick := line_thickness;
+
+ z0 = foot - 1/4arrow_spread * dir (alpha + 90);
+ z1 = 9/20[foot,head] + 1/4arrow_spread * dir (alpha + 90);
+ z2 = 19/20[foot,head] - 1/2arrow_spread * dir (alpha + 90);
+
+ penpos0(thick, alpha - 35);
+ penpos1(thick, alpha - 90);
+ penpos2(thick, alpha - 150);
+
+ fill stroke z0.e{dir (alpha + 55)} .. z1.e .. {dir (alpha - 60)}z2.e;
+ draw_arrowhead(z2, alpha - 50, arrow_spread, thick);
+
+ if negated:
+ stroke_through_arrow(1/10[z1,z2] + 1/8arrow_spread * dir (alpha - 90), alpha, 3/2arrow_spread)(80, 80, 80, 80, 80, 80, 80, 80);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 1, ifneg(3/2,1) * arrow_spread#); "left bend arrow (" & decimal alpha & ")";
+ thick := line_thickness;
+
+ z0 = foot + 1/4arrow_spread * dir (alpha + 90);
+ z1 = 9/20[foot,head] - 1/4arrow_spread * dir (alpha + 90);
+ z2 = 19/20[foot,head] + 1/2arrow_spread * dir (alpha + 90);
+
+ penpos0(thick, alpha + 35);
+ penpos1(thick, alpha + 90);
+ penpos2(thick, alpha + 150);
+
+ fill stroke z0.e{dir (alpha - 55)} .. z1.e .. {dir (alpha + 60)}z2.e;
+ draw_arrowhead(z2, alpha + 50, arrow_spread, thick);
+
+ if negated:
+ stroke_through_arrow(1/10[z1,z2] + 1/8arrow_spread * dir (alpha + 90), alpha, 3/2arrow_spread)(110, 110, 110, 110, 110, 110, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270, 45, 135, 225, 315:
+ beginarrow(alpha, 6/5, ifneg(3/2,1) * arrow_spread#); "bidirectional bend arrow (" & decimal alpha & ")";
+ thick := line_thickness;
+
+ z0 = 1/20[foot,head] - 1/2arrow_spread * dir (alpha + 90);
+ z1 = 1/2[foot,head] + 1/4arrow_spread * dir (alpha + 90);
+ z2 = 19/20[foot,head] - 1/2arrow_spread * dir (alpha + 90);
+
+ penpos0(thick, alpha - 30);
+ penpos1(thick, alpha - 90);
+ penpos2(thick, alpha - 150);
+
+ fill stroke z0.e{dir (alpha + 60)} .. z1.e .. {dir (alpha - 60)}z2.e;
+ draw_arrowhead(z0, alpha + 230, arrow_spread, thick);
+ draw_arrowhead(z2, alpha - 50, arrow_spread, thick);
+
+ if negated:
+ stroke_through_arrow(z1 + 1/8arrow_spread * dir (alpha - 90), alpha, 3/2arrow_spread)(80, 80, 100, 100, 80, 80, 100, 100);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 180:
+ beginarrow(alpha, 1, ifneg(3/2,1) * arrow_spread#); "headless arrow with foot (" & decimal alpha & ")";
+ draw_line(foot_ex, head_ex, false);
+ draw_line(foot - 1/2arrow_spread * dir (alpha + 90), foot + 1/2arrow_spread * dir (alpha + 90), true);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ for alpha = 0, 90, 180, 270:
+ beginoperator(large_op_size#, 1);
+ if sign > 0: "right" else: "left" fi & " circle arrow (" & decimal alpha & ")";
+
+ thick := line_thickness;
+ r := (w - 2side_bearing)/2 - arrow_spread/3;
+
+ for i = 0 upto 7:
+ z[i] = centre + r * dir (alpha + i/8 * 360);
+ penpos[i](thick, alpha + i/8 * 360);
+ endfor;
+
+ z0' = centre + r * dir (alpha + 10);
+ penpos0'(thick, alpha + 10);
+ z0'' = centre + r * dir (alpha - 10);
+ penpos0''(thick, alpha - 10);
+
+ penlabels(0',0'',1,2,3,4,5,6,7);
+
+ fill stroke z0'.e{dir (alpha + 100)} .. z1.e .. z2.e .. z3.e .. z4.e .. z5.e .. z6.e .. z7.e .. {dir (alpha + 80)}z0''.e;
+
+ if sign > 0:
+ draw_arrowhead(z0'', (alpha + 65), arrow_spread, thick);
+ else:
+ draw_arrowhead(z0', (alpha - 65), arrow_spread, thick);
+ fi;
+
+ if negated:
+ 1/2[z8,z9] = centre;
+ if (alpha = 90) or (alpha = 270):
+ y8 - y9 = large_op_size * sind 45;
+ z8 - z9 = whatever * dir 40;
+ else:
+ y8 - y9 = large_op_size;
+ z8 - z9 = whatever * dir 80;
+ fi
+
+ draw_straight(z8, z9, stroke_through_thickness, false);
+ fi
+ endchar;
+ endfor;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginarrow(alpha, 6/5, ifneg(21/10, 14/10) * arrow_spread#); "triple arrow (" & decimal alpha & ")";
+ z1 - z0 = z2 - z1 = 2/3equal_spread * dir (alpha + 90);
+ z1 = foot_ex;
+ z4 - z3 = z5 - z4 = 2/3equal_spread * dir (alpha + 90);
+ z4 = head_ex;
+
+ draw_straight(z0, arrowhead_intersection(head, alpha, 3/2arrow_spread, z0 -- z3), 4/5line_thickness, false);
+ draw_straight(z1, arrowhead_intersection(head, alpha, 3/2arrow_spread, z1 -- z4), 4/5line_thickness, false);
+ draw_straight(z2, arrowhead_intersection(head, alpha, 3/2arrow_spread, z2 -- z5), 4/5line_thickness, false);
+ draw_arrowhead(head, alpha, 3/2arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - arrow_spread * dir alpha], alpha, 21/10arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 180:
+ beginarrow(alpha, 2, ifneg(3/2, 1) * arrow_spread#); "long single arrow (" & decimal alpha & ")";
+ draw_line(foot_ex, head, false);
+ draw_arrowhead(head, alpha, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 1/2arrow_spread * dir alpha], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 180:
+ beginarrow(alpha, 2, ifneg(19/10, 13/10) * arrow_spread#); "long double arrow (" & decimal alpha & ")";
+ z1 - z0 = z3 - z2 = equal_spread * dir (alpha + 90);
+ 1/2[z0,z1] = foot_ex;
+ 1/2[z2,z3] = head;
+
+ draw_line(z0, arrowhead_intersection(head, alpha, 13/10arrow_spread, z0 -- z2), false);
+ draw_line(z1, arrowhead_intersection(head, alpha, 13/10arrow_spread, z1 -- z3), false);
+ draw_arrowhead(head, alpha, 13/10arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - arrow_spread * dir alpha], alpha, 19/10arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0:
+ beginarrow(alpha, 2, ifneg(3/2, 1) * arrow_spread#); "long bidirectional arrow (" & decimal alpha & ")";
+ draw_line(foot, head, false);
+ draw_arrowhead(head, alpha, arrow_spread, line_thickness);
+ draw_arrowhead(foot, alpha+180, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0:
+ beginarrow(alpha, 2, ifneg(19/10, 13/10) * arrow_spread#); "long double bidirectional arrow (" & decimal alpha & ")";
+ z1 - z0 = z3 - z2 = equal_spread * dir (alpha + 90);
+ 1/2[z0,z1] = foot;
+ 1/2[z2,z3] = head;
+
+ draw_line(arrowhead_intersection(foot, alpha+180, 13/10arrow_spread, z0 -- z2), arrowhead_intersection(head, alpha, 13/10arrow_spread, z0 -- z2), false);
+ draw_line(arrowhead_intersection(foot, alpha+180, 13/10arrow_spread, z1 -- z3), arrowhead_intersection(head, alpha, 13/10arrow_spread, z1 -- z3), false);
+ draw_arrowhead(head, alpha, 13/10arrow_spread, line_thickness);
+ draw_arrowhead(foot, alpha+180, 13/10arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 19/10arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 180:
+ beginarrow(alpha, 2, ifneg(3/2, 1) * arrow_spread#); "long arrow with foot (" & decimal alpha & ")";
+ draw_line(foot, head, false);
+ draw_line(foot - 1/2arrow_spread * dir (alpha + 90), foot + 1/2arrow_spread * dir (alpha + 90), true);
+ draw_arrowhead(head, alpha, arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 1/2arrow_spread * dir alpha], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 180:
+ beginarrow(alpha, 2, ifneg(19/10, 13/10) * arrow_spread#); "long double arrow with foot (" & decimal alpha & ")";
+ z1 - z0 = z3 - z2 = equal_spread * dir (alpha + 90);
+ 1/2[z0,z1] = foot_ex;
+ 1/2[z2,z3] = head;
+
+ draw_line(z0, arrowhead_intersection(head, alpha, 13/10arrow_spread, z0 -- z2), false);
+ draw_line(z1, arrowhead_intersection(head, alpha, 13/10arrow_spread, z1 -- z3), false);
+ draw_line(foot - 13/20arrow_spread * dir (alpha + 90), foot + 13/20arrow_spread * dir (alpha + 90), true);
+ draw_arrowhead(head, alpha, 13/10arrow_spread, line_thickness);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - arrow_spread * dir alpha], alpha, 19/10arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 180:
+ beginarrow(alpha, 2, ifneg(3/2, 1) * arrow_spread#); "long wave arrow (" & decimal alpha & ")";
+ thick := line_thickness;
+ sign := if alpha > 0: 1 else: -1 fi;
+
+ z0 = foot - 1/8arrow_spread * up;
+ z1 = 4/43[foot,head] + 1/4arrow_spread * up;
+ z2 = 7/43[foot,head];
+ z3 = 10/43[foot,head] - 1/4arrow_spread * up;
+ z4 = 13/43[foot,head];
+ z5 = 16/43[foot,head] + 1/4arrow_spread * up;
+ z6 = 19/43[foot,head];
+ z7 = 22/43[foot,head] - 1/4arrow_spread * up;
+ z8 = 25/43[foot,head];
+ z9 = 28/43[foot,head] + 1/4arrow_spread * up;
+ z10 = 31/43[foot,head];
+ z11 = 34/43[foot,head] - 1/4arrow_spread * up;
+ z12 = 36/43[foot,head] - 1/8arrow_spread * up;
+ z13 = 38/43[foot,head];
+ z14 = head;
+
+ penpos0(thick, sign * 35);
+ penpos1(thick, sign * 90);
+ penpos2(thick, sign * 145);
+ penpos3(thick, sign * 90);
+ penpos4(thick, sign * 35);
+ penpos5(thick, sign * 90);
+ penpos6(thick, sign * 145);
+ penpos7(thick, sign * 90);
+ penpos8(thick, sign * 35);
+ penpos9(thick, sign * 90);
+ penpos10(thick, sign * 145);
+ penpos11(thick, sign * 90);
+ penpos12(thick, sign * 45);
+ penpos13(thick, sign * 90);
+ penpos14(thick, sign * 90);
+
+ penlabels(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14);
+
+ fill stroke z0e{dir (sign * 35 + 90)} .. z1.e{dir (sign * 90 + 90)} .. z2.e{dir (sign * 145 + 90)} .. z3.e{dir (sign * 90 + 90)} .. z4.e{dir (sign * 35 + 90)} .. z5.e{dir (sign * 90 + 90)} .. z6.e{dir (sign * 145 + 90)} .. z7.e{dir (sign * 90 + 90)} .. z8.e{dir (sign * 35 + 90)} .. z9.e{dir (sign * 90 + 90)} .. z10.e{dir (sign * 145 + 90)} .. z11.e{dir (sign * 90 + 90)} .. z12.e{dir (sign * 45 + 90)} .. {dir (sign * 90 + 90)}z13.e -- z14.e;
+ draw_arrowhead(z14, alpha, arrow_spread, thick);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head - 1/2arrow_spread * dir alpha], alpha, 3/2arrow_spread)(70, 70, 70, 70, 70, 70, 70, 70);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 180:
+ beginarrow(alpha, 2, ifneg(3/2,1) * arrow_spread#); "long headless arrow with foot (" & decimal alpha & ")";
+ draw_line(foot_ex, head_ex, false);
+ draw_line(foot - 1/2arrow_spread * dir (alpha + 90), foot + 1/2arrow_spread * dir (alpha + 90), true);
+
+ if negated:
+ stroke_through_arrow(1/2[foot, head], alpha, 3/2arrow_spread)(70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+endfor;
+
+if not negated:
+ for sign = 1, -1:
+ beginsymbol(4/3arrow_spread# + line_thickness# + 2side_bearing#, vcentre(2arrow_spread# + line_thickness#)); "left shift";
+ y0 = y1 = h - 1/2arrow_spread - 1/2line_thickness;
+ y2 = -d + 1/2line_thickness;
+ 1/2[x0,x1] = w/2;
+ x1 - x0 = sign * 4/3arrow_spread;
+ x2 = x1;
+
+ draw_line(z2, z1, true);
+ draw_line(z1, z0, false);
+ draw_arrowhead(z0, 90 + sign * 90, arrow_spread, line_thickness);
+ endchar;
+ endfor;
+
+ for sign = 1, -1:
+ beginsymbol(4/3arrow_spread# + line_thickness# + 2side_bearing#, vcentre(2arrow_spread# + line_thickness#)); "left down shift";
+ y0 = y1 = -d + 1/2arrow_spread + 1/2line_thickness;
+ y2 = h - 1/2line_thickness;
+ 1/2[x0,x1] = w/2;
+ x1 - x0 = sign * 4/3arrow_spread;
+ x2 = x1;
+
+ draw_line(z2, z1, true);
+ draw_line(z1, z0, false);
+ draw_arrowhead(z0, 90 + sign * 90, arrow_spread, line_thickness);
+ endchar;
+ endfor;
+
+ for sign = -1, 1:
+ beginsymbol(arrow_diag_len# + 2side_bearing#, vcentre(arrow_diag_len#)); "loop arrow";
+ thick := line_thickness;
+ arrow_len := arrow_diag_len;
+ pair centre;
+ centre := (w/2, (h-d)/2);
+
+ z0 = centre + sign * (arrow_len - line_thickness)/2 * left;
+ z1 = centre + arrow_len/2 * down;
+ z2 = centre + (arrow_len - line_thickness)/4 * up;
+ z3 = centre + sign * (arrow_len - line_thickness)/4 * right;
+ z4 = centre + (arrow_len - line_thickness) * (1/4sign, 1/2);
+ z5 = centre + (arrow_len - line_thickness) * (1/2sign, 1/4);
+
+ penpos0(thick, - sign * 90);
+ penpos1(thick, 180);
+ penpos2(thick, 180);
+ penpos3(thick, - sign * 90);
+ penpos4(thick, sign * 90);
+ penpos5(thick, 0);
+
+ fill stroke z0e -- z3e{sign * right} .. {up}z5e .. {sign * left}z4e .. {down}z2e -- z1e;
+ draw_arrowhead(z0, 90 + sign * 90, arrow_spread, thick);
+
+ penlabels(0,1,2,3,4,5);
+ endchar;
+ endfor;
+fi
diff --git a/fonts/fdsymbol/source/fdbase.mf b/fonts/fdsymbol/source/fdbase.mf
new file mode 100644
index 0000000000..af4a9b28e4
--- /dev/null
+++ b/fonts/fdsymbol/source/fdbase.mf
@@ -0,0 +1,956 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+design_size := 10;
+font_size design_size * pt#;
+
+if known ps_output:
+ font_version := "1.008";
+ font_comment := "Copyright (c) 2012, Michael Ummels. This Font Software is licensed under the SIL Open Font License, Version 1.1.";
+fi
+
+u# := 0.6pt#;
+asc_height# := 7.54pt#; % 8.56pt#;
+cap_height# := 7.07pt#; %7.37pt#;
+desc_depth# := 2.2pt#; % 2.94pt#;
+x_height# := 5.46pt#;
+math_axis# := 2.75pt#;
+if weight_index = 0: % Book
+ line_thickness# := 0.64pt#;
+ rule_thickness# := 0.56pt#;
+ dot_size# := 0.75pt#;
+elseif weight_index = 1: % Regular
+ line_thickness# := 0.74pt#;
+ rule_thickness# := 0.58pt#;
+ dot_size# := 0.84pt#;
+elseif weight_index = 2: % Medium
+ line_thickness# := 0.86pt#;
+ rule_thickness# := 0.6pt#;
+ dot_size# := 0.94pt#;
+else: % Bold
+ line_thickness# := 1.0pt#;
+ rule_thickness# := 0.64pt#;
+ dot_size# := 1.06pt#;
+fi;
+
+side_bearing# := 1.5u#;
+small_op_size# := 8u#; % radius of small operators
+med_op_size# := 12.5u#; % radius of medium operators
+plus_size# := 9u#;
+large_op_size# := 18u#; % radius of large operators
+order_width# := 8u#; % width of equal sign
+turnstile_width# := 11u#; % width of turnstile symbols
+equal_spread# := .7math_axis#; % distance between the lines of the equal sign
+greater_spread# := 10/4equal_spread#; % distance between the ends of the greater sign
+arrow_horiz_len# := 12.5u#; % length of horizontal arrows
+arrow_vert_len# := 12.5u#; % length of vertical arrows
+arrow_diag_len# := 1/2(arrow_horiz_len# + arrow_vert_len#);
+arrow_spread# := 1.6equal_spread#;
+delim_height# := 4.9pt#; % half the height of normal delimiters
+bigop_height# := 10.7pt#; % height of big operators
+
+mode_setup;
+
+define_pixels(u, asc_height, cap_height, desc_depth, delim_height, bigop_height, x_height);
+define_whole_pixels(dot_size, small_op_size, med_op_size, large_op_size, plus_size,
+ order_width, turnstile_width, equal_spread, greater_spread,
+ arrow_horiz_len, arrow_vert_len, arrow_diag_len, arrow_spread);
+
+if known ps_output:
+ define_pixels(math_axis, line_thickness, rule_thickness, side_bearing);
+else:
+ math_axis := good.y(math_axis# * hppp);
+ line_thickness := ceiling(line_thickness# * hppp);
+ rule_thickness := ceiling(rule_thickness# * hppp);
+ side_bearing := ceiling(side_bearing# * hppp);
+fi
+
+stroke_through_thickness := 9/10line_thickness;
+
+% Macros
+
+% Redefine clockwise and counterclockwise (turningnumber seems more stable)
+if known ps_output:
+ vardef counterclockwise primary p =
+ (if turningnumber p>0: p else: (reverse p) fi)
+ enddef;
+
+ vardef clockwise primary p =
+ (if turningnumber p<0: p else: (reverse p) fi)
+ enddef;
+fi
+
+% Selects the n-th element of a list
+def select(expr n)(text values) =
+ begingroup;
+ i := 0;
+ for v = values:
+ result := v;
+ exitif i = n;
+ i := i + 1;
+ endfor;
+ result
+ endgroup
+enddef;
+
+% Splits a length at the math axis
+def vcentre(expr size) =
+ size/2 + math_axis#, size/2 - math_axis#
+enddef;
+
+current_char := -1;
+
+def beginsymbol(expr width, height, depth) =
+ current_char := current_char + 1;
+ beginchar(current_char, width, height, depth);
+ if not known ps_output:
+ proofrule((side_bearing, math_axis),(w - side_bearing, math_axis));
+ proofrule((side_bearing, h),(side_bearing, -d));
+ proofrule((w - side_bearing, h),(w - side_bearing, -d));
+ fi
+enddef;
+
+def beginoperator(expr size, ratio) =
+ beginsymbol(size + 2side_bearing#, vcentre(ratio * size));
+ pair centre;
+ centre := (w/2, (h-d)/2);
+ radius := w/2 - side_bearing - 1/2line_thickness;
+enddef;
+
+def beginbigop(expr xscale, yscale) =
+ beginsymbol(xscale * 3/2order_width# + 2side_bearing#, vcentre(yscale * bigop_height#));
+ pair centre;
+ centre := (w/2, (h-d)/2);
+ op_width := xscale * 3/2order_width;
+ op_height := yscale * bigop_height;
+enddef;
+
+def beginsquarebigop(expr xscale, yscale) =
+ beginsymbol(xscale * bigop_height# + 2side_bearing#, vcentre(yscale * bigop_height#));
+ pair centre;
+ centre := (w/2, (h-d)/2);
+ op_width := xscale * bigop_height;
+ op_height := yscale * bigop_height;
+enddef;
+
+def beginarrow(expr angle, scale, spread) =
+ arrow_len# := scale *
+ if angle mod 180 = 0: arrow_horiz_len#
+ elseif angle mod 180 = 90: arrow_vert_len#
+ else: arrow_diag_len#
+ fi;
+ arrow_len := scale *
+ if angle mod 180 = 0: arrow_horiz_len
+ elseif angle mod 180 = 90: arrow_vert_len
+ else: arrow_diag_len
+ fi;
+
+ beginsymbol(arrow_len# * abs(cosd(angle)) + (spread + line_thickness#) * abs(sind(angle)) + 2side_bearing#, vcentre(arrow_len# * abs(sind(angle)) + (spread + line_thickness#) * abs(cosd(angle))));
+ pair centre, head, head_ex, foot, foot_ex;
+
+ centre := (w/2, (h-d)/2);
+ head := centre + (arrow_len - line_thickness)/2 * dir angle;
+ head_ex := centre + arrow_len/2 * dir angle;
+ foot := centre - (arrow_len - line_thickness)/2 * dir angle;
+ foot_ex := centre - arrow_len/2 * dir angle;
+enddef;
+
+def beginorder(expr sign, width, spread) =
+ beginsymbol(width + 2side_bearing#, vcentre(spread + line_thickness#));
+ pair centre, left_ex, right_ex, left_point, right_point;
+ centre := (w/2, (h-d)/2);
+ left_ex := centre - sign * (w/2 - side_bearing) * right;
+ left_point := centre - sign * (w/2 - side_bearing - line_thickness/2) * right;
+ right_ex := centre + sign * (w/2 - side_bearing) * right;
+ right_point := centre + sign * (w/2 - side_bearing - line_thickness/2) * right;
+enddef;
+
+def beginturnstile(expr angle, scale) =
+ beginsymbol(abs(sind(angle) + scale * cosd(angle)) * turnstile_width# + 2side_bearing#, abs(min(scale, 1 + (scale - 1)/2) * sind(angle) + cosd(angle)) * cap_height#, abs(max(0, (scale - 1)/2) * sind(angle)) * cap_height#);
+ pair foot;
+
+ if angle mod 180 = 0:
+ len := scale * turnstile_width;
+ spread := cap_height - line_thickness;
+ else:
+ len := scale * cap_height;
+ spread := turnstile_width - line_thickness;;
+ fi
+ foot = (w/2, (h - d)/2) - (len - line_thickness)/2 * dir angle;
+enddef;
+
+% Strokes a pen path
+vardef stroke text t =
+ forsuffixes e = l, r:
+ path_.e := t;
+ endfor
+ path_.r -- reverse path_.l -- cycle
+enddef;
+
+% Shapes
+
+def circle(expr centre, radius) =
+ (centre + radius * right){up} ...
+ (centre + radius * dir 45){dir 135} ...
+ (centre + radius * up){left} ...
+ (centre + radius * dir 135){dir 225} ...
+ (centre + radius * left){down} ...
+ (centre + radius * dir 225){dir 315} ...
+ (centre + radius * down){right} ...
+ (centre + radius * dir 315){dir 45} ...
+ cycle
+enddef;
+
+def square(expr centre, radius, angle) =
+ (centre + sqrt(2) * radius * dir (angle + 45)) --
+ (centre + sqrt(2) * radius * dir (angle + 135)) --
+ (centre + sqrt(2) * radius * dir (angle + 225)) --
+ (centre + sqrt(2) * radius * dir (angle + 315)) --
+ cycle
+enddef;
+
+def triangle(expr centre, radius, angle) =
+ (centre + radius * dir angle) --
+ (centre + radius * dir (angle + 120)) --
+ (centre + radius * dir (angle + 240)) --
+ cycle
+enddef;
+
+def reg_poly_points(suffix $)(expr n, centre, radius, angle) =
+ for i = 0 upto n-1:
+ z$[i] = centre + radius * dir (angle + i/n * 360);
+ endfor;
+enddef;
+
+def dot(expr centre, radius) =
+ superellipse(centre + radius * right, centre + radius * up,
+ centre - radius * right, centre - radius * up, 0.6)
+enddef;
+
+% Draw macros
+
+def draw_straight(expr orig, dest, thick, extend) =
+ begingroup;
+ pair p[].l, p[].r;
+
+ theta := angle (dest - orig);
+ if extend:
+ 1/2[p1.l,p1.r] = orig - 1/2thick * dir theta;
+ 1/2[p2.l,p2.r] = dest + 1/2thick * dir theta;
+ else:
+ 1/2[p1.l,p1.r] = orig;
+ 1/2[p2.l,p2.r] = dest;
+ fi
+ p1.l - p1.r = p2.l - p2.r = thick * dir (theta + 90);
+ fill stroke p1.e -- p2.e;
+ endgroup;
+enddef;
+
+def draw_line(expr orig, dest, extend) =
+ draw_straight(orig, dest, line_thickness, extend);
+enddef;
+
+def draw_circle(expr centre, radius, thick) =
+ fill circle(centre, radius + 1/2thick);
+ unfill circle(centre, radius - 1/2thick);
+enddef;
+
+def filldraw_circle(expr centre, radius, thick) =
+ fill circle(centre, radius + 1/2thick);
+enddef;
+
+def draw_square(expr centre, radius, angle, thick) =
+ fill square(centre, radius + 1/2thick, angle);
+ unfill square(centre, radius - 1/2thick, angle);
+enddef;
+
+def filldraw_square(expr centre, radius, angle, thick) =
+ fill square(centre, radius + 1/2thick, angle);
+enddef;
+
+def draw_triangle(suffix $)(expr centre, radius, angle, thick) =
+ fill triangle(centre, radius + thick, angle);
+ unfill triangle(centre, radius - thick, angle);
+enddef;
+
+def filldraw_triangle(suffix $)(expr centre, radius, angle, thick) =
+ fill triangle(centre, radius + thick, angle);
+enddef;
+
+def draw_sim(suffix $)(expr lc, rc, spread, thick) =
+ theta := angle (length(rc - lc), 10spread);
+ signum := cosd (angle (rc - lc)) + sind (angle (lc - rc));
+
+ z0$.l = lc;
+ z4$.r = rc;
+ z2$ = 1/2[lc, rc];
+ z4$.r = rc;
+ 1/2[z1$,z3$] = z2$;
+ z1$ = 1/4[lc, rc] + 1/6thick * dir (angle (rc - lc)) +
+ signum * spread * dir (angle (rc - lc) + 90);
+
+ penpos0$(5/6thick, angle(rc - lc) - signum * (90 - theta));
+ penpos1$(thick, angle(rc - lc) - signum * 90);
+ penpos2$(thick, angle(rc - lc) - signum * (theta + 90 - 5));
+ penpos3$(thick, angle(rc - lc) - signum * 90);
+ penpos4$(5/6thick, angle(rc - lc) - signum * (90 - theta));
+
+ fill stroke z0$.e{dir (angle(rc - lc) + signum * theta)} .. {dir angle(rc - lc)}z1$.e .. {dir (angle(rc - lc) - signum * (theta - 5))}z2$.e .. {dir angle(rc - lc)}z3$.e .. {dir (angle(rc - lc) + signum * theta)}z4$.e;
+
+ penlabels(0$,1$,3$,4$);
+enddef;
+
+def draw_bump(suffix $)(expr sign, lc, rc, rad, thick) =
+ z0$ = lc;
+ z1$ = rc;
+ z2$ = 1/2[lc, rc] + sign * rad * dir (angle (rc - lc) + 90);
+ z3$ = 1/2[lc, rc] - rad * dir (angle (rc - lc));
+ 1/2[z3$,z4$] = 1/2[lc, rc];
+
+ penpos0$(thick, angle (rc - lc) + sign * 90);
+ penpos1$(thick, angle (rc - lc) + sign * 90);
+ penpos2$(thick, angle (rc - lc) + sign * 90);
+ penpos3$(thick, angle (rc - lc));
+ penpos4$(thick, angle (rc - lc));
+
+ z5$ = z3$.r;
+ z6$ = z4$.l;
+
+ penpos5$(thick, angle (rc - lc) + sign * 90);
+ penpos6$(thick, angle (rc - lc) + sign * 90);
+
+ path p$, q$;
+ numeric s$, t$;
+
+ p$ = z3$.l{dir (angle(rc - lc) + sign * 90)} .. {rc - lc}z2$.r;
+ q$ = z2$.r{rc - lc} .. {dir (angle(rc - lc) - sign * 90)}z4$.r;
+ s$ = xpart (p$ intersectiontimes (z0$.r -- z1$.r));
+ t$ = xpart (q$ intersectiontimes (z0$.r -- z1$.r));
+
+ fill z0$.r -- point s$ of p$ & subpath (s$,1) of p$ & subpath (0,t$) of q$ & point t$ of q$ -- z1$.r -- z1$.l -- z6$l. -- z6${dir (angle (rc - lc) + sign * 90)} .. z2$.l{lc - rc} .. {dir (angle (rc - lc) - sign * 90)}z5$ -- z5$.l -- z0$.l -- cycle;
+
+ penlabels(0$,1$,2$,3$,4$,5$,6$);
+enddef;
+
+def draw_less(suffix $)(expr lc, rc, spread, thick, closed) =
+ theta := angle((length(rc - lc) - thick/2) * right + spread/2 * up);
+
+ z2$ = lc + 1/2thick * dir (angle (rc - lc));
+ 1/2[z0$.r,z1$.r] = rc;
+ z0$ = z2$ + whatever * dir (angle (rc - lc) + theta);
+ z1$ = z2$ + whatever * dir (angle (rc - lc) - theta);
+
+ penpos0$(thick, angle(rc - lc) - 90 + theta);
+ penpos1$(thick, angle(rc - lc) + 90 - theta);
+ penpos3$(thick, angle(rc - lc) - 90 + theta);
+ penpos4$(thick, angle(rc - lc) + 90 - theta);
+
+ z3$.l = z0$.l + whatever * (z2$ - z0$);
+ z4$.l = z1$.l + whatever * (z2$ - z1$);
+ 1/2[z3$.l,z4$.l] = lc;
+ z5$ = z0$.r + whatever * (z2$ - z0$);
+ z5$ = z1$.r + whatever * (z2$ - z1$);
+
+ fill z0$.l -- z3$.l -- z4$.l -- z1$.l -- z1$.r -- z5$ -- z0$.r -- cycle;
+
+ if closed:
+ penpos6$(thick, angle(rc - lc));
+ penpos7$(thick, angle(rc - lc));
+ z6$.l = whatever[z0$.l,z3$.l];
+ z6$.r = whatever[z0$.r,z1$.r];
+ z7$.l = whatever[z1$.l,z4$.l];
+ z7$.r = whatever[z0$.r,z1$.r];
+ fill z0$.l -- z6$.l -- z7$.l -- z1$.l -- z7$.r -- z6$.r -- cycle;
+ fi;
+
+ penlabels(0$,1$,3$,4$,5$,6$,7$);
+enddef;
+
+def draw_prec(suffix $)(expr lc, rc, spread, thick, closed) =
+ theta := 43;
+
+ z0$ - z1$ = spread * dir (angle (rc - lc) + 90);
+ 1/2[z0$.r,z1$.l] = rc;
+ z2$ = lc;
+ z2$' = lc + 1/2thick * dir angle(rc - lc);
+
+ penpos0$(thick, angle(rc - lc) - theta);
+ penpos1$(thick, angle(rc - lc) + 180 + theta);
+ penpos2$(thick, angle(rc - lc) - 90);
+ penpos2$'(thick, angle(rc - lc) - 90);
+
+ fill stroke z2$.e -- z2$'.e{dir angle(rc - lc)} .. {dir (angle (rc - lc) + 90 - theta)}z0$.e;
+ fill stroke z2$.e -- z2$'.e{dir angle(rc - lc)} .. {dir (angle (rc - lc) - 90 + theta)}z1$.e;
+
+ if closed:
+ z3$ = point 1/2 of (z0${dir (angle (rc - lc) - 90 - theta + 10)}
+ .. {dir (angle (rc - lc) - 90 + theta - 10)}z1$);
+ penpos3$(thick, angle(rc - lc));
+
+ fill z0$.l .. z3$.l .. z1$.r -- z1$.l .. z3$.r .. z0$.r -- cycle;
+ fi;
+
+ penlabels(0$,1$,2$,3$);
+enddef;
+
+def draw_subset(suffix $)(expr lc, rc, spread, thick) =
+ 1/2[z0$,z1$] = rc;
+ 1/2[z2$,z3$] = (4spread / 9abs(rc - lc))[z4$, rc];
+ z0$ - z1$ = z2$ - z3$ = spread * dir (angle (rc - lc) + 90);
+ z4$ = lc + 1/2thick * dir (angle (rc - lc));
+
+ penpos0$(thick, angle(rc - lc) - 90);
+ penpos1$(thick, angle(rc - lc) + 90);
+ penpos2$(thick, angle(rc - lc) - 90);
+ penpos3$(thick, angle(rc - lc) + 90);
+ penpos4$(thick, angle(rc - lc));
+
+ fill stroke z0$.e -- z2$.e{lc - rc} .. z4$.e .. {rc - lc}z3$.e -- z1$.e;
+
+ penlabels(0$,1$,2$,3$,4$)
+enddef;
+
+def draw_smile(suffix $)(expr sign, lc, rc, spread, thick, round) =
+ z0$ = lc + sign * 1/2spread * dir (angle(rc - lc) + 90) +
+ whatever * (rc - lc);
+ z0$.l = lc + whatever * dir (angle(rc - lc) + 90);
+ z1$ = rc + sign * 1/2spread * dir (angle(rc - lc) + 90) +
+ whatever * (rc - lc);
+ z1$.l = rc + whatever * dir (angle(rc - lc) + 90);
+ z2$ = 1/2[lc,rc] - sign * 1/2spread * dir (angle(rc - lc) + 90);
+
+ if round:
+ theta := angle (length(lc - rc), 5spread);
+ else:
+ theta := angle (length(lc - rc), 2spread);
+ fi;
+
+ penpos0$(thick, angle(rc - lc) + sign * (90 - theta));
+ penpos1$(thick, angle(rc - lc) + sign * (90 + theta));
+
+ if round:
+ penpos2$(thick, angle(rc - lc) + sign * 90);
+
+ fill stroke z0$.e{dir (angle(rc - lc) - sign * theta)} ..
+ {rc - lc}z2$.e{rc - lc} .. {dir (angle(rc - lc) + sign * theta)}z1$.e;
+ else:
+ penpos2$(thick / cosd theta, angle(rc - lc) + sign * 90);
+
+ fill stroke z0$.e -- z2$.e -- z1$.e;
+ fi;
+
+ penlabels(0$, 1$, 2$);
+enddef;
+
+def stroke_through_angle(expr pos, spread, angle) =
+ begingroup;
+ stroke_len := 1/2spread / cosd (90 - angle);
+
+ draw_straight(pos + stroke_len * dir angle, pos - stroke_len * dir angle, stroke_through_thickness, true);
+ endgroup;
+enddef;
+
+def stroke_through(expr pos, spread) =
+ stroke_through_angle(pos, spread, 75);
+enddef;
+
+def stroke_through_arrow(expr pos, alpha, spread)(text angles) =
+ begingroup;
+ stroke_dir := alpha + select(alpha / 45)(angles);
+ stroke_len := 1/2spread / sind (stroke_dir - alpha);
+
+ draw_straight(pos + stroke_len * dir stroke_dir, pos - stroke_len * dir stroke_dir, stroke_through_thickness, true);
+ endgroup;
+enddef;
+
+def draw_product(expr centre, width, height, sign, thick, serifs) =
+ if serifs:
+ thicker := 11/8thick;
+ thinner := 5/8thick;
+ else:
+ thicker := 4/3thick;
+ thinner := thick;
+ fi
+
+ z1r - z0r = z3r - z2r = width * right;
+ y2r - y0l = sign * height;
+ x2r = x0r;
+ 1/2[1/2[z0l,z1l], 1/2[z2r,z3r]] = centre;
+ z4 - z0 = z1 - z5 = min(3thicker, 2/5width) * right;
+ x6 = x8 = 1/2[x0,x4];
+ x7 = x9 = 1/2[x1,x5];
+ if serifs:
+ y6 - y0 = y7 - y1 = sign * 1/4(x4 - x0);
+ y2 - y8 = y3 - y9 = sign * 1/4(x4 - x0);
+ else:
+ y6 = y7 = y0l;
+ y8 = y9 = y2l;
+ fi
+
+ penpos0(thinner, sign * 100);
+ penpos1(thinner, sign * 80);
+ if serifs:
+ penpos2(thinner, sign * 93);
+ penpos3(thinner, sign * 87);
+ else:
+ penpos2(thicker, sign * 90);
+ penpos3(thicker, sign * 90);
+ fi
+ penpos4(thinner, sign * 80);
+ penpos5(thinner, sign * 100);
+ penpos6(thicker, 0);
+ penpos7(thicker, 0);
+ penpos8(thicker, 0);
+ penpos9(thicker, 0);
+
+ y10 = y11 = y2r - sign * 1/2[thinner,thicker];
+ x10 = x6r;
+ x11 = x7l;
+
+ if serifs:
+ fill z0l -- z4l -- z4r{dir (sign * 165)} ... {sign * up}z6r -- z10 -- z11 -- z7l{sign * down} ... {dir (-sign * 165)}z5r -- z5l -- z1l -- z1r{dir (sign * 165)} ... {sign * up}z7r -- z9r{sign * up} ... {dir (sign * 15)}z3l -- z3r -- z2r -- z2l{dir (-sign * 15)} ... {sign * down}z8l -- z6l{sign * down} ... {dir (-sign * 165)}z0r -- cycle;
+ penlabels(0,1,2,3,4,5,6,7,8,9,10,11);
+ else:
+ fill z6l -- z8l -- z2l -- z2r -- z3r -- z3l -- z9r -- z7r -- z7l -- z9l -- z8r -- z6r -- cycle;
+ penlabels(2,3,6,7,8,9);
+ fi
+enddef;
+
+def draw_sum(suffix $)(expr centre, width, height, thick, serifs) =
+ thicker := 11/8thick;
+ thinner := 1/2thick;
+ alpha := angle(width, height - thicker);
+
+ z1$ - z0$ = z3$ - z2$ = width * right;
+ z2$ - z0$ = height * up;
+ 1/2[1/2[z0$,z1$], 1/2[z2$,z3$]] = centre;
+ z4$ - z1$ = z3$ - z5$.l = 3/2thicker * up;
+ if serifs:
+ z6$ = whatever[z0$,z1$] + thicker/2 * up = z4$ - whatever * dir 77;
+ z3$ - z7$ = 2/3thicker * up;
+ else:
+ z6$l = z1$;
+ z3$ - z7$ = thicker * up;
+ fi
+ z8$r = z2$ + whatever * right;
+ z8$l = z2$ + whatever * down;
+ z10$r = z0$ + whatever * up;
+ z10$l = z0$ + whatever * right;
+ z9$' = 1/4[z7$,z8$l];
+ z11$' = 1/4[z6$r,z10$r];
+ z12$ = centre;
+
+ if serifs:
+ penpos4$(thinner, 167);
+ penpos5$(thinner, 180);
+ penpos6$(thicker, 90);
+ penpos8$(5/6thicker, 77);
+ penpos10$(3/4thicker, 103);
+ penpos12$(thicker / sind alpha, 10);
+ else:
+ penpos6$(thicker, 90);
+ penpos8$(thicker, 90);
+ penpos10$(thicker, 90);
+ penpos12$(thicker / sind alpha, 0);
+ fi
+
+ z9$ = z12$r + whatever * (z8$l - z12$l) = z7$ + whatever * right;
+ z11$ = z12$r + whatever * (z10$r - z12$l);
+ y11$ = y10$r;
+
+ if serifs:
+ fill z10$l -- z6$l -- z4$l -- z4$r{-dir 77} ... {z11$ - z11$'}z11$' -- z11$ -- z12$r -- z9$ -- z9$'{z9$' - z9$} ... {-dir 113}z5$r -- z5$l -- z3$ -- z8$r -- z8$l -- z12$l -- z10$r -- cycle;
+ penlabels(3$,4$,5$,6$,7$,8$,9$,10$,11$,12$);
+ else:
+ fill z10$l -- z6$l -- z6$r -- z11$ -- z12$r -- z9$ -- z7$ -- z3$ -- z8$r -- z8$l -- z12$l -- z10$r -- cycle;
+ penlabels(3$,6$,7$,8$,9$,10$,11$,12$);
+ fi
+enddef;
+
+def draw_integral(suffix $)(expr scale, centre, thick) =
+ thicker := 4/3thick;
+
+ penpos0$(thicker, 0);
+ penpos1$(thicker, 0);
+ penpos2$(9/8thick, -105);
+ penpos3$(thicker, 0);
+ penpos4$(thick, -90);
+
+ z0$ = 1/2[z1$,z3$] = 1/2[z2$,z4$];
+ z1$ - z3$ = whatever * up;
+ z2$ - z4$ = whatever * dir 75;
+
+ x0$ = xpart centre;
+ y2$l = h;
+ y6$r = -d;
+ y1$ = 2/3[y0$,y2$];
+
+ penpos5$(9/8thick,-105);
+ penpos6$(9/8thick,-82);
+
+ y5$l = y2$l - 1/12thick;
+ x5$r = 5/4[x1$, x2$];
+ y6$l = y4$l;
+ x6$r = 5/4[x3$, x4$];
+
+ ucorr := max (x2$r, x1$r + 3/8thick) - x2$r;
+ x2$ := x2$ + ucorr;
+ x2$l := x2$l + ucorr;
+ x2$r := x2$r + ucorr;
+ x5$ := x5$ + ucorr;
+ x5$r := x5$r + ucorr;
+ x5$l := x5$l + ucorr;
+
+ lcorr := min (x4$l, x1$l - 3/8thick) - x4$l;
+ x4$ := x4$ + lcorr;
+ x4$l := x4$l + lcorr;
+ x4$r := x4$r + lcorr;
+ x6$ := x6$ + lcorr;
+ x6$r := x6$r + lcorr;
+ x6$l := x6$l + lcorr;
+
+ fill z5$l .. z2$l ... {down}z1$l -- z3$l{down} ... z4$l{left} .. z6$l -- z6$r
+ .. {up}z3$r -- z1$r{up} .. z2$r{right} .. z5$r -- cycle;
+
+ penlabels(0$,1$,2$,3$,4$,5$,6$);
+enddef;
+
+def draw_arrowhead_left(expr pos, angle, spread, thick) =
+ begingroup;
+ pair p[], p[].l, p[].r;
+
+ p1 = pos;
+ p2 = pos + sqrt(2) * (spread + 1/2thick)/2 * dir (angle + 135);
+ 1/2[p1.l, p1.r] = p1;
+ 1/2[p2.l, p2.r] = p2;
+ p1.r - p1 = thick/(2 * sind 45) * dir angle;
+ p2.r - p2 = thick/2 * dir (angle + 45);
+ p3.l = whatever[p2.l,p1.l];
+ p3.l = pos + 1/2thick * dir (angle - 90) + whatever * dir angle;
+ p3.r - p1.r = whatever * dir (angle - 105);
+ p3.r = pos + 1/2thick * dir (angle - 90) + whatever * dir angle;
+ fill p1.r -- p2.r -- p2.l -- p3.l -- p3.r -- cycle;
+ endgroup;
+enddef;
+
+def draw_arrowhead_right(expr pos, angle, spread, thick) =
+ begingroup;
+ pair p[], p[].l, p[].r;
+
+ p1 = pos;
+ p2 = pos + sqrt(2) * (spread + 1/2thick)/2 * dir (angle - 135);
+ 1/2[p1.l, p1.r] = p1;
+ 1/2[p2.l, p2.r] = p2;
+ p1.r - p1 = thick/(2 * sind 45) * dir angle;
+ p2.r - p2 = thick/2 * dir (angle - 45);
+ p3.l = whatever[p2.l,p1.l];
+ p3.l = pos + 1/2thick * dir (angle + 90) + whatever * dir angle;
+ p3.r - p1.r = whatever * dir (angle + 105);
+ p3.r = pos + 1/2thick * dir (angle + 90) + whatever * dir angle;
+ fill p1.r -- p3.r -- p3.l -- p2.l -- p2.r -- cycle;
+ endgroup;
+enddef;
+
+def draw_arrowhead(expr pos, angle, spread, thick) =
+ begingroup;
+ pair p[], p[].l, p[].r;
+
+ p1 = pos;
+ p2 = pos + sqrt(2) * spread/2 * dir (angle + 135);
+ p3 = pos + sqrt(2) * spread/2 * dir (angle - 135);
+ 1/2[p1.l, p1.r] = p1;
+ 1/2[p2.l, p2.r] = p2;
+ 1/2[p3.l, p3.r] = p3;
+ p1.r - p1 = thick/(2 * sind 45) * dir angle;
+ p2.r - p2 = thick/2 * dir (angle + 45);
+ p3.r - p3 = thick/2 * dir (angle - 45);
+
+ fill p1.r -- p2.r -- p2.l -- p1.l -- p3.l -- p3.r -- cycle;
+ endgroup;
+enddef;
+
+% intersect the arrowhead curve with a path
+def arrowhead_intersection(expr pos, angle, spread, p) =
+ (p intersectionpoint
+ ((pos + sqrt(2) * spread/2 * dir (angle + 135)) --
+ pos -- (pos + sqrt(2) * spread/2 * dir (angle - 135)))
+ )
+enddef;
+
+def draw_bracket(expr sign, thick, draw_top, draw_mid, draw_bot, draw_double) =
+ penpos0(thick, 90 - sign * 90);
+ penpos1(thick, 90 - sign * 90);
+ penpos2(thick, 90);
+ penpos3(thick, 90);
+ penpos4(thick, 90);
+ penpos5(thick, 90);
+ penpos6(thick, 0);
+ penpos7(thick, 0);
+
+ x3 - x2 = x5 - x4 = sign * (w - 2side_bearing);
+ 1/2[x2,x3] = w/2;
+
+ if draw_top:
+ y1 = h;
+ else:
+ y1 = h + 1/2line_thickness;
+ fi;
+
+ if draw_bot:
+ y0 = -d;
+ else:
+ y0 = -d - 1/2line_thickness;
+ fi;
+
+ x1 = x0;
+ z6 = 1/2[z2l,z3l] + sign * 1/2thick * right;
+ z7 = 1/2[z4r,z5r] + sign * 1/2thick * right;
+ y2l = y3l;
+ y4r = y5r;
+ z2l = z0l;
+ z4r = z1l;
+
+ if draw_mid:
+ fill stroke z0e -- z1e;
+ else:
+ if draw_bot: fill stroke z0e -- z0e + (w - 2side_bearing) * up; fi;
+ if draw_top: fill stroke z1e -- z1e + (w - 2side_bearing) * down; fi;
+ fi;
+ if draw_top: fill stroke z4e -- z5e; fi;
+ if draw_bot: fill stroke z2e -- z3e; fi;
+ if draw_double: fill stroke z6e -- z7e; fi;
+enddef;
+
+def draw_angle(suffix $)(expr shift, sign, thick) =
+ x0$ = x1$ = x2$ + sign * (w - 2side_bearing -2abs shift - thick);
+
+ top y1$ = h;
+ bot y0$ = -d;
+ 1/2[y0$,y1$] = y2$;
+ 1/2[x0$,x2$] = w/2 + shift;
+
+ theta := angle(z0$ - z2$) + 90;
+
+ penpos0$ (thick, theta);
+ penpos1$ (thick, -theta);
+ penpos2$ (thick * cosd theta, 0);
+
+ fill stroke z0$e -- z2$e -- z1$e;
+
+ penlabels(0$, 1$, 2$);
+enddef;
+
+def draw_paren(expr sign, thick) =
+ penpos0(thick, 90 - sign * 45);
+ penpos1(thick, -90 + sign * 45);
+ penpos2(thick, 90 - sign * 90);
+
+ x0 = x1 = x2 + sign * (w - 2side_bearing - thick);
+ y1.l = h;
+ y0.l = -d;
+ 1/2[y0,y1] = y2;
+ 1/2[x0r,x2l] = w/2;
+
+ fill stroke z0e{3(x2e - x0e), y2e - y0e} .. z2e .. {3(x1e - x2e), y1e - y2e}z1e;
+
+ penlabels(0,1,2);
+enddef;
+
+def draw_brace(expr centre, size, width, alpha, thick, top_size, mid_size, bot_size) =
+ penpos1(5/6thick, alpha + 90);
+ penpos2(thick, alpha);
+ penpos2'(thick,alpha);
+ penpos3(thick, alpha);
+ penpos3'(thick,alpha);
+ penpos4(11/12thick, alpha+90);
+ penpos5(thick, alpha+180);
+ penpos5'(thick, alpha+180);
+ penpos6(thick, alpha+180);
+ penpos6'(thick, alpha+180);
+ penpos7(5/6thick, alpha+90);
+
+ z1r - z7l = size * dir (alpha + 90);
+
+ centre - 1/2[z1,z7] = z4 - centre = width/2 * dir alpha;
+
+ z0 = centre;
+
+ z3 = z0 + (1/3width + 1/2thick) * dir (alpha + 90);
+ z5 = z0 - (1/3width + 1/2thick) * dir (alpha + 90);
+
+ z2 = z0 + (size/2 - 1/3width - thick) * dir (alpha + 90);
+ z6 = z0 - (size/2 - 1/3width - thick) * dir (alpha + 90);
+
+ z3' = z0 + (mid_size/2 + 1/2line_thickness) * dir (alpha + 90);
+ z5' = z0 - (mid_size/2 + 1/2line_thickness) * dir (alpha + 90);
+
+ z2' = z0 + (size/2 - top_size - 1/2line_thickness) * dir (alpha + 90);
+ z6' = z0 - (size/2 - bot_size - 1/2line_thickness) * dir (alpha + 90);
+
+ beta := 0;
+
+ if top_size > 0:
+ fill stroke z1e{dir alpha} .. {dir (alpha - 90)}z2e -- z2'e;
+ penlabels(1,2,2');
+ elseif bot_size > 0:
+ fill stroke z7e{dir alpha} .. {dir (alpha + 90)}z6e -- z6'e;
+ penlabels(6',6,7);
+ elseif mid_size > 0:
+ fill stroke z3'e -- z3e{dir (alpha - 90)} .. {dir alpha}z4e;
+ fill stroke z5'e -- z5e{dir (alpha + 90)} .. {dir alpha}z4e;
+ penlabels(3',3,4,5,5');
+ else:
+ fill stroke z1e{dir alpha} .. z2e{dir (alpha - 90)} -- z3e{dir (alpha - 90)} .. z4e{dir alpha};
+ fill stroke z7e{dir alpha} .. {dir (alpha + 90)}z6e -- z5e{dir (alpha + 90)} .. {dir alpha}z4e;
+ penlabels(1,2,3,4,5,6,7);
+ fi;
+enddef;
+
+def draw_root(expr thick) =
+ penpos0(rule_thickness, -90);
+ penpos0'(rule_thickness, -90);
+ penpos2(3/2thick, 0);
+
+ y0l = h;
+ x0 = w;
+ z0' = z0 + 1/2line_thickness * right;
+ y1 = -d;
+ x1 = 4/9w;
+ x2 = 2/9w;
+ y2 = 1/2[y0, y1];
+ z1' = z1 + thick * dir (angle (z1 - z2l) + 90);
+ y6 = h;
+ z6 = z0r + thick * dir (angle (z0r - z1') + 90) + whatever * (z0r - z1');
+
+ penpos3(1/2thick, angle (z1 - z2l));
+
+ z3l = z2r + 5/2thick * dir (angle (z1 - z2l) - 90);
+ z4 = z6 + whatever * (z0 - z1') = z2r + whatever * (z2l - z1);
+ z5 = whatever[z2l, z1] = z3r + whatever * dir (angle (z1 - z2l) - 90);
+
+ fill z3r -- z5 -- z1 -- z1' -- z0r -- z0'r -- z0'l -- z6 -- z4 -- z2r -- z3l -- cycle;
+
+ penlabels (0,0',1,1',2,3,4,5,6);
+enddef;
+
+def draw_root_top(expr thick) =
+ y0 = h - 1/2rule_thickness;
+ x0 = w;
+ y1 = -d;
+ x1 = x2 = 4/9w + 1/2thick;
+ y2 = h - 1/2thick;
+
+ draw_straight(z1, z2, thick, true);
+ draw_straight((x1,y0), z0, rule_thickness, true);
+enddef;
+
+def draw_root_bot(expr thick) =
+ penpos0(thick, 0);
+ penpos0'(thick, -90);
+ penpos2(3/2thick, 0);
+
+ y0 = h + 1/2thick;
+ x0l = x1;
+ y1 = -d;
+ x1 = 4/9w;
+ x2l = 1/9w;
+ y2 = 1/2[y0, y1];
+ z1' = z1 + whatever * dir (angle (z1 - z2l) + 90);
+ x1' = x0r;
+
+ penpos3(1/2thick, angle (z1 - z2l));
+
+ z3l = z2r + 5/2thick * dir (angle (z1 - z2l) - 90);
+ z4 = z0l + whatever * up = z2r + whatever * (z2l - z1);
+ z5 = whatever[z2l, z1] = z3r + whatever * dir (angle (z1 - z2l) - 90);
+
+ fill z3r -- z5 -- z1 -- z1' -- z0r -- z0l -- z4 -- z2r -- z3l -- cycle;
+
+ penlabels (0,1,1',2,3,4,5);
+enddef;
+
+% Weierstrass macros
+
+def ellipse_set(suffix $,@,@@,$$) =
+ % given |z$,x@,z$$|, find |y@| and |z@@|
+ % such that the path |z${x@-x$,0}..z@{0,y@-y$}..{z$$-z@@}z@@|
+ % is consistent with an ellipse
+ % and such that the line |z@@--z$$| has a given |slope|
+ alpha_ := slope * (x@ - x$);
+ beta_ := y$$ - y$ - slope * (x$$ - x$);
+ gamma_ := alpha_ / beta_;
+ y@ - y$ = .5(beta_ - alpha_ * gamma_);
+ x@@ - x$ = -2gamma_ * (x@ - x$) / (1 + gamma_ * gamma_);
+ y@@ - y$$ = slope * (x@@ - x$$)
+enddef;
+
+vardef super_arc.r(suffix $,$$) =
+ % outside of super-ellipse
+
+ pair centre, corner;
+
+ if y$ = y$r:
+ centre = (x$$r, y$r);
+ corner = (x$r, y$$r);
+ else:
+ centre = (x$r, y$$r);
+ corner = (x$$r, y$r);
+ fi
+ z$.r{corner - z$.r} ... superness[centre,corner]{z$$.r - z$.r}
+ ... {z$$.r - corner}z$$.r
+enddef;
+
+vardef super_arc.l(suffix $,$$) =
+ % inside of super-ellipse
+
+ pair centre, corner;
+ if y$ = y$r:
+ centre = (x$$l, y$l);
+ corner = (x$l, y$$l);
+ else:
+ centre = (x$l, y$$l);
+ corner = (x$$l, y$l);
+ fi
+ z$l{corner - z$l} ... superness[centre,corner]{z$$l - z$l}
+ ... {z$$l - corner}z$$l
+enddef;
+
+vardef pulled_super_arc.r(suffix $,$$)(expr superpull) =
+ pair centre, corner;
+
+ if y$ = y$r:
+ centre = (x$$r, y$r);
+ corner = (x$r, y$$r);
+ else:
+ centre = (x$r, y$$r);
+ corner = (x$$r, y$r);
+ fi
+ z$r{corner - z$r} ... superness[centre,corner]{z$$r - z$r}
+ ... {z$$r - corner}z$$r
+enddef;
+
+vardef pulled_super_arc.l(suffix $,$$)(expr superpull) =
+ pair centre, corner, outer_point;
+
+ if y$ = y$r:
+ centre = (x$$l, y$l);
+ corner = (x$l, y$$l);
+ outer_point = superness[(x$$r, y$r), (x$r, y$$r)];
+ else:
+ centre = (x$l, y$$l);
+ corner = (x$$l, y$l);
+ outer_point = superness[(x$r, y$$r), (x$$r, y$r)];
+ fi
+ z$l{corner - z$l}
+ ... superpull[superness[centre,corner], outer_point]{z$$l - z$l}
+ ... {z$$l - corner}z$$l
+enddef;
+
+vardef pulled_arc@#(suffix $,$$) =
+ pulled_super_arc@#($,$$)(superpull)
+enddef;
diff --git a/fonts/fdsymbol/source/fddelims.mf b/fonts/fdsymbol/source/fddelims.mf
new file mode 100644
index 0000000000..a0d652e8e1
--- /dev/null
+++ b/fonts/fdsymbol/source/fddelims.mf
@@ -0,0 +1,601 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+% thickness factor for delimiters
+def dthick(expr scale) =
+ 1
+enddef;
+
+% parenthesis
+
+lparen_char = current_char + 1;
+rparen_char = current_char + 7;
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((2scale + 4.5)/2 * u# + line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "parenthesis";
+ draw_paren(sign, dthick(scale) * line_thickness);
+ endchar;
+ endfor;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol((6 + 4.5)/2 * u# + line_thickness# + 2side_bearing#, vcentre(3delim_height#)); "parenthesis -- top";
+ thick := dthick(3) * line_thickness;
+
+ penpos1(thick, -90 + sign * 60);
+ penpos2(thick, 90 - sign * 90);
+ penpos2'(thick, 90 - sign * 90);
+
+ x1 = x2 + sign * (w - 2side_bearing - thick);
+ x2 = x2';
+ y1 = h;
+ y2 = -d + 1/2line_thickness;
+ y2' = -d - 1/2line_thickness;
+ 1/2[x1r,x2l] = w/2;
+
+ fill stroke z2'.e -- z2e{up} .. {3(x1e - x2e), y1e - y2e}z1e;
+
+ penlabels(1,2,2');
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol((6 + 4.5)/2 * u# + line_thickness# + 2side_bearing#, vcentre(3delim_height#)); "parenthesis -- bot";
+ thick := dthick(3) * line_thickness;
+
+ penpos0(thick, 90 - sign * 60);
+ penpos2(thick, 90 - sign * 90);
+ penpos2'(thick, 90 - sign * 90);
+
+ x0 = x2 + sign * (w - 2side_bearing - thick);
+ x2 = x2';
+ y2 = h - 1/2line_thickness;
+ y2' = h + 1/2line_thickness;
+ y0 = -d;
+ 1/2[x0r,x2l] = w/2;
+
+ fill stroke z0e{3(x2e - x0e), y2e - y0e} .. {up}z2e -- z2'.e;
+
+ penlabels(1,2,2');
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol((6 + 4.5)/2 * u# + line_thickness# + 2side_bearing#, vcentre(0.6delim_height#)); "parenthesis -- module";
+ thick := dthick(3) * line_thickness;
+
+ penpos1(thick, 90 - sign * 45);
+ penpos2(thick, 90 - sign * 90);
+ penpos3(thick, 90 - sign * 90);
+
+ x2 = x3 = x1 - sign * (w - 2side_bearing - thick);
+ y2 = h + 1/2line_thickness;
+ y3 = -d - 1/2line_thickness;
+ 1/2[x1r,x2l] = w/2;
+
+ fill stroke z2e -- z3e;
+ endchar;
+endfor;
+
+extensible current_char - 1: current_char - 5, 0, current_char - 3, current_char - 1; %left parenthesis
+extensible current_char: current_char - 4, 0, current_char - 2, current_char; %right parenthesis
+
+charlist lparen_char: lparen_char + 1: lparen_char + 2: lparen_char + 3: lparen_char + 4: lparen_char + 5: current_char - 1;
+charlist rparen_char: rparen_char + 1: rparen_char + 2: rparen_char + 3: rparen_char + 4: rparen_char + 5: current_char;
+
+% brackets
+
+lsquare_char = current_char + 1;
+rsquare_char = current_char + 7;
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((2scale + 4)/2 * u# + line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "square bracket";
+ draw_bracket(sign, dthick(scale) * line_thickness, true, true, true, false);
+ endchar;
+ endfor;
+endfor;
+
+lfloor_char = current_char + 1;
+rfloor_char = current_char + 7;
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((2scale + 4)/2 * u# + line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "floor";
+ draw_bracket(sign, dthick(scale) * line_thickness, false, true, true, false);
+ endchar;
+ endfor;
+endfor;
+
+lceil_char = current_char + 1;
+rceil_char = current_char + 7;
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((2scale + 4)/2 * u# + line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "ceiling";
+ draw_bracket(sign, dthick(scale) * line_thickness, true, true, false, false);
+ endchar;
+ endfor;
+endfor;
+
+ulcorner_char = current_char + 1;
+urcorner_char = current_char + 7;
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((2scale + 4)/2 * u# + line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "upper corner";
+ draw_bracket(sign, dthick(scale) * line_thickness, true, false, false, false);
+ endchar;
+ endfor;
+endfor;
+
+charlist ulcorner_char: ulcorner_char + 1: ulcorner_char + 2: ulcorner_char + 3: ulcorner_char + 4: ulcorner_char + 5;
+charlist urcorner_char: urcorner_char + 1: urcorner_char + 2: urcorner_char + 3: urcorner_char + 4: urcorner_char + 5;
+
+llcorner_char = current_char + 1;
+lrcorner_char = current_char + 7;
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((2scale + 4)/2 * u# + line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "lower corner";
+ draw_bracket(sign, dthick(scale) * line_thickness, false, false, true, false);
+ endchar;
+ endfor;
+endfor;
+
+charlist llcorner_char: llcorner_char + 1: llcorner_char + 2: llcorner_char + 3: llcorner_char + 4: llcorner_char + 5;
+charlist lrcorner_char: lrcorner_char + 1: lrcorner_char + 2: lrcorner_char + 3: lrcorner_char + 4: lrcorner_char + 5;
+
+ullcorner_char = current_char + 1;
+ulrcorner_char = current_char + 7;
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((2scale + 4)/2 * u# + line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "upper/lower corner";
+ draw_bracket(sign, dthick(scale) * line_thickness, true, false, true, false);
+ endchar;
+ endfor;
+endfor;
+
+charlist ullcorner_char: ullcorner_char + 1: ullcorner_char + 2: ullcorner_char + 3: ullcorner_char + 4: ullcorner_char + 5;
+charlist ulrcorner_char: ulrcorner_char + 1: ulrcorner_char + 2: ulrcorner_char + 3: ulrcorner_char + 4: ulrcorner_char + 5;
+
+for sign = 1, -1:
+ beginsymbol(5u# + line_thickness# + 2side_bearing#, vcentre(1.2delim_height#)); "square bracket -- top";
+ draw_bracket(sign, dthick(3) * line_thickness, true, true, false, false);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol(5u# + line_thickness# + 2side_bearing#, vcentre(1.2delim_height#)); "square bracket -- bot";
+ draw_bracket(sign, dthick(3) * line_thickness, false, true, true, false);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol(5u# + line_thickness# + 2side_bearing#, vcentre(0.6delim_height#)); "square bracket -- module";
+ draw_bracket(sign, dthick(3) * line_thickness, false, true, false, false);
+ endchar;
+endfor;
+
+extensible current_char - 1: current_char - 5, 0, current_char - 3, current_char - 1; %left square bracket
+extensible current_char: current_char - 4, 0, current_char - 2, current_char; %right square bracket
+extensible current_char - 3: 0, 0, current_char - 3, current_char - 1; %left floor
+extensible current_char - 2: 0, 0, current_char - 2, current_char; %right floor
+extensible current_char - 5: current_char - 5, 0, 0, current_char - 1; %left ceiling
+extensible current_char - 4: current_char - 4, 0, 0, current_char; %right ceiling
+
+charlist lsquare_char: lsquare_char + 1: lsquare_char + 2: lsquare_char + 3: lsquare_char + 4: lsquare_char + 5: current_char - 1;
+charlist rsquare_char: rsquare_char + 1: rsquare_char + 2: rsquare_char + 3: rsquare_char + 4: rsquare_char + 5: current_char;
+charlist lfloor_char: lfloor_char + 1: lfloor_char + 2: lfloor_char + 3: lfloor_char + 4: lfloor_char + 5: current_char - 3;
+charlist rfloor_char: rfloor_char + 1: rfloor_char + 2: rfloor_char + 3: rfloor_char + 4: rfloor_char + 5: current_char - 2;
+charlist lceil_char: lceil_char + 1: lceil_char + 2: lceil_char + 3: lceil_char + 4: lceil_char + 5: current_char - 5;
+charlist rceil_char: rceil_char + 1: rceil_char + 2: rceil_char + 3: rceil_char + 4: rceil_char + 5: current_char - 4;
+
+% semantic brackets
+
+lsem_char = current_char + 1;
+rsem_char = current_char + 7;
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((2scale + 4)/2 * u# + 2line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "semantic bracket";
+ draw_bracket(sign, dthick(scale) * line_thickness, true, true, true, true);
+ endchar;
+ endfor;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol(5u# + 2line_thickness# + 2side_bearing#, vcentre(1.2delim_height#)); "semantic bracket -- top";
+ draw_bracket(sign, dthick(3) * line_thickness, true, true, false, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol(5u# + 2line_thickness# + 2side_bearing#, vcentre(1.2delim_height#)); "semantic bracket -- bot";
+ draw_bracket(sign, dthick(3) * line_thickness, false, true, true, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol(5u# + line_thickness# + 2side_bearing#, vcentre(0.6delim_height#)); "semantic bracket -- module";
+ draw_bracket(sign, dthick(3) * line_thickness, false, true, false, true);
+ endchar;
+endfor;
+
+extensible current_char - 1: current_char - 5, 0, current_char - 3, current_char - 1; %left semantic bracket
+extensible current_char: current_char - 4, 0, current_char - 2, current_char; %right semantic bracket
+
+charlist lsem_char: lsem_char + 1: lsem_char + 2: lsem_char + 3: lsem_char + 4: lsem_char + 5: current_char - 1;
+charlist rsem_char: rsem_char + 1: rsem_char + 2: rsem_char + 3: rsem_char + 4: rsem_char + 5: current_char;
+
+% curly braces
+
+lcurly_char = current_char + 1;
+rcurly_char = current_char + 7;
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((2scale + 5.5)/2 * u# + line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "curly brace";
+ thick := dthick(scale) * line_thickness;
+
+ draw_brace((w/2, (h-d)/2), h + d, w - 2side_bearing, 90 + sign * 90, thick, 0, 0, 0)
+ endchar;
+ endfor;
+endfor;
+
+beginsymbol((6 + 5.5)/2 * u# + line_thickness# + 2side_bearing#, vcentre(1.2delim_height#)); "curly brace -- top";
+ thick := dthick(3) * line_thickness;
+
+ draw_brace((w/2, h - 3delim_height), 6delim_height, w - 2side_bearing, 180, thick, 0, 0, h + d);
+endchar;
+
+beginsymbol((6 + 5.5)/2 * u# + line_thickness# + 2side_bearing#, vcentre(1.2delim_height#)); "curly brace -- top";
+ thick := dthick(3) * line_thickness;
+
+ draw_brace((w/2, h - 3delim_height), 6delim_height, w - 2side_bearing, 0, thick, h + d, 0, 0);
+endchar;
+
+beginsymbol((6 + 5.5)/2 * u# + line_thickness# + 2side_bearing#, vcentre(1.2delim_height#)); "curly brace -- bot";
+ thick := dthick(3) * line_thickness;
+
+ draw_brace((w/2, 3delim_height - d), 6delim_height, w - 2side_bearing, 180, thick, h + d, 0, 0)
+endchar;
+
+beginsymbol((6 + 5.5)/2 * u# + line_thickness# + 2side_bearing#, vcentre(1.2delim_height#)); "curly brace -- bot";
+ thick := dthick(3) * line_thickness;
+
+ draw_brace((w/2, 3delim_height - d), 6delim_height, w - 2side_bearing, 0, thick, 0, 0, h + d)
+endchar;
+
+for sign = 1, -1:
+ beginsymbol((6 + 5.5)/2 * u# + line_thickness# + 2side_bearing#, vcentre(1.2delim_height#)); "curly brace -- middle";
+ thick := dthick(3) * line_thickness;
+
+ draw_brace((w/2, (h-d)/2), 6delim_height, w - 2side_bearing, 90 + sign * 90, thick, 0, h + d, 0);
+ endchar;
+endfor;
+
+beginsymbol((6 + 5.5)/2 * u# + line_thickness# + 2side_bearing#, vcentre(0.6delim_height#)); "curly brace -- module";
+ thick := dthick(3) * line_thickness;
+
+ x2 = x3 = w/2;
+ y2 = h + 1/2line_thickness;
+ y3 = -d - 1/2line_thickness;
+
+ draw_straight(z2, z3, thick, false);
+endchar;
+
+extensible current_char - 6: current_char - 6, 0, current_char - 4, current_char; %sharp left parenthesis
+extensible current_char - 5: current_char - 5, 0, current_char - 3, current_char; %sharp right parenthesis
+extensible current_char - 3: current_char - 6, 0, current_char - 3, current_char; %left moustache
+extensible current_char - 4: current_char - 5, 0, current_char - 4, current_char; %right moustache
+extensible current_char - 2: current_char - 6, current_char - 2, current_char - 4, current_char; %left curly brace
+extensible current_char - 1: current_char - 5, current_char - 1, current_char - 3, current_char; %right curly brace
+extensible current_char: 0, 0, 0, current_char; %vertical line
+
+charlist lcurly_char: lcurly_char + 1: lcurly_char + 2: lcurly_char + 3: lcurly_char + 4: lcurly_char + 5: current_char - 2;
+charlist rcurly_char: rcurly_char + 1: rcurly_char + 2: rcurly_char + 3: rcurly_char + 4: rcurly_char + 5: current_char - 1;
+
+% angle brackets
+
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((2scale + 4)/2 * u# + line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "angle bracket";
+ draw_angle(a, 0, sign, dthick(scale) * line_thickness);
+ endchar;
+ endfor;
+ charlist current_char - 5: current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((2scale + 8)/2 * u# + 2line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "double angle bracket";
+ thick := dthick(scale) * line_thickness;
+
+ draw_angle(a, -5/4thick, sign, thick);
+ draw_angle(b, 5/4thick, sign, thick);
+ endchar;
+ endfor;
+ charlist current_char - 5: current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((2scale + 4)/2 * u# + line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "angle bracket with dot";
+ thick := dthick(scale) * line_thickness;
+
+ draw_angle(a, 0, sign, thick);
+
+ if sign > 0:
+ x3 = w - side_bearing - 3/4dot_size;
+ else:
+ x3 = side_bearing + 3/4dot_size;
+ fi
+ y3 = 1/2(h - d);
+
+ fill dot(z3, 3/4dot_size);
+ endchar;
+ endfor;
+ charlist current_char - 5: current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char;
+endfor;
+
+% slash
+
+for sign = 1, -1:
+ for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol(6scale * u# + line_thickness# + side_bearing#, vcentre(2scale * delim_height#)); "slash";
+ x1 - x0 = sign * (w - 2side_bearing - line_thickness);
+ y1 = h;
+ y0 = -d;
+ 1/2[x0,x1] = w/2;
+
+ draw_line(z0, z1, false);
+ endchar;
+ endfor;
+ charlist current_char - 5: current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char;
+endfor;
+
+% vertical bars
+
+for negated = false, true:
+ for scale = 0.5, 1, 1.2:
+ beginsymbol(2u# + if negated: 2u# + floor scale * u# else: 0u# fi + line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "vertical bar";
+ x0 = x1 = w/2;
+ y0 = h;
+ y1 = -d;
+
+ draw_line(z0, z1, false);
+
+ if negated:
+ if scale < 1: theta := 30; else: theta := 45; fi
+ len := 1/2(4u + floor scale * u) / cosd theta;
+
+ draw_straight(1/2[z0,z1] + len * dir theta, 1/2[z0,z1] - len * dir theta, stroke_through_thickness, true);
+ fi
+ endchar;
+ endfor;
+endfor;
+
+beginsymbol(2u# + line_thickness# + 2side_bearing#, vcentre(0.6delim_height#)); "vertical bar -- module";
+ x0 = x1 = w/2;
+ y0 = h + 1/2line_thickness;
+ y1 = -d - 1/2line_thickness;
+
+ draw_line(z0, z1, false);
+endchar;
+
+extensible current_char: 0, 0, 0, current_char; % vertical bar
+charlist current_char - 5: current_char - 4: current_char;
+
+for negated = false, true:
+ for scale = 0.5, 1, 1.2:
+ beginsymbol(5u# + if negated: 2u# + floor scale * u# else: 0u# fi + 2line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "double vertical bar";
+ x0 = x1;
+ x2 = x3;
+ 1/2[x0,x2] = w/2;
+ x2 - x0 = 3u + line_thickness;
+ y0 = y2 = h;
+ y1 = y3 = -d;
+
+ draw_line(z0, z1, false);
+ draw_line(z2, z3, false);
+
+ if negated:
+ if scale < 1: theta := 30; else: theta := 45; fi
+ len := 1/2(7u + floor scale * u + line_thickness) / cosd theta;
+ pair centre;
+ centre := 1/2[1/2[z0,z1],1/2[z2,z3]];
+
+ draw_straight(centre + len * dir theta, centre - len * dir theta, stroke_through_thickness, true);
+ fi
+ endchar;
+ endfor;
+endfor;
+
+beginsymbol(5u# + 2line_thickness# + 2side_bearing#, vcentre(0.6delim_height#)); "double vertical bar -- module";
+ x0 = x1;
+ x2 = x3;
+ 1/2[x0,x2] = w/2;
+ x2 - x0 = 3u + line_thickness;
+ y0 = y2 = h + 1/2line_thickness;
+ y1 = y3 = -d - 1/2line_thickness;
+
+ draw_line(z0, z1, false);
+ draw_line(z2, z3, false);
+endchar;
+
+extensible current_char: 0, 0, 0, current_char; % double vertical line
+charlist current_char - 5: current_char -4: current_char;
+
+for scale = 1, 1.2:
+ beginsymbol(8u# + 3line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "triple vertical bar";
+ x0 = x1;
+ x2 = x3;
+ x4 = x5;
+ 1/2[x0,x4] = w/2;
+ x2 - x0 = x4 - x2 = 3u + line_thickness;
+ y0 = y2 = y4 = h;
+ y1 = y3 = y5 = -d;
+
+ draw_line(z0, z1, false);
+ draw_line(z2, z3, false);
+ draw_line(z4, z5, false);
+ endchar;
+endfor;
+
+beginsymbol(8u# + 3line_thickness# + 2side_bearing#, vcentre(0.6delim_height#)); "triple vertical bar -- module";
+ x0 = x1;
+ x2 = x3;
+ x4 = x5;
+ 1/2[x0,x4] = w/2;
+ x2 - x0 = x4 - x2 = 3u + line_thickness;
+ y0 = y2 = y4 = h + 1/2line_thickness;
+ y1 = y3 = y5 = -d - 1/2line_thickness;
+
+ draw_line(z0, z1, false);
+ draw_line(z2, z3, false);
+ draw_line(z4, z5, false);
+endchar;
+
+extensible current_char: 0, 0, 0, current_char; % triple vertical line
+charlist current_char - 2: current_char -1: current_char;
+
+% Arrows
+
+for arrow_dir = 90, 270:
+ beginsymbol(5u# + line_thickness# + 2side_bearing#, vcentre(1.2delim_height#)); "arrow up/down";
+ pair foot, head;
+
+ if arrow_dir = 90:
+ head = (w/2, h - 1/2line_thickness);
+ foot = (w/2, -d);
+ else:
+ head = (w/2, -d + 1/2line_thickness);
+ foot = (w/2, h + 1/2line_thickness);
+ fi;
+
+ draw_line(foot, head, false);
+ draw_arrowhead(head, arrow_dir, arrow_spread, line_thickness);
+ endchar;
+endfor;
+
+beginsymbol(5u# + line_thickness# + 2side_bearing#, vcentre(0.6delim_height#)); "arrow module";
+ z0 = (w/2, h);
+ z1 = (w/2, -d);
+
+ draw_line(z0, z1, true);
+endchar;
+
+extensible current_char-2: current_char-2, 0, current_char, current_char;
+extensible current_char-1: current_char, 0, current_char-1, current_char;
+extensible current_char: current_char-2, 0, current_char-1, current_char;
+
+for arrow_dir = 90, 270:
+ beginsymbol(7u# + line_thickness# + 2side_bearing#, vcentre(1.2delim_height#)); "double arrow up/down";
+ pair foot, head;
+
+ if arrow_dir = 90:
+ head = (w/2, h - 1/2line_thickness);
+ foot = (w/2, -d - 1/2line_thickness);
+ else:
+ head = (w/2, -d + 1/2line_thickness);
+ foot = (w/2, h + 1/2line_thickness);
+ fi;
+
+ z1 - z0 = z3 - z2 = equal_spread * dir (arrow_dir + 90);
+ 1/2[z0,z1] = foot;
+ 1/2[z2,z3] = head;
+
+ draw_line(z0, arrowhead_intersection(head, arrow_dir, 13/10arrow_spread, z0 -- z2), false);
+ draw_line(z1, arrowhead_intersection(head, arrow_dir, 13/10arrow_spread, z1 -- z3), false);
+ draw_arrowhead(head, arrow_dir, 13/10arrow_spread, line_thickness);
+ endchar;
+endfor;
+
+beginsymbol(7u# + line_thickness# + 2side_bearing#, vcentre(0.6delim_height#)); "double arrow module";
+ z1 - z0 = z3 - z2 = equal_spread * right;
+ 1/2[z0,z1] = (w/2, h);
+ 1/2[z2,z3] = (w/2, -d);
+
+ draw_line(z0, z2, true);
+ draw_line(z1, z3, true);
+endchar;
+
+extensible current_char-2: current_char-2, 0, current_char, current_char;
+extensible current_char-1: current_char, 0, current_char-1, current_char;
+extensible current_char: current_char-2, 0, current_char-1, current_char;
+
+% horizontal curly braces
+
+beginsymbol(1/2delim_height#, vcentre((6 + 5.5)/2 * u# + line_thickness#)); "horizontal curly brace -- left";
+ draw_brace((3delim_height, (h-d)/2), 6delim_height, h + d, 90, line_thickness, w, 0, 0);
+endchar;
+
+beginsymbol(1/2delim_height#, vcentre((6 + 5.5)/2 * u# + line_thickness#)); "horizontal curly brace -- left";
+ draw_brace((3delim_height, (h-d)/2), 6delim_height, h + d, -90, line_thickness, 0, 0, w);
+endchar;
+
+beginsymbol(1/2delim_height#, vcentre((6 + 5.5)/2 * u# + line_thickness#)); "horizontal curly brace -- right";
+ draw_brace((w - 3delim_height, (h-d)/2), 6delim_height, h + d, 90, line_thickness, 0, 0, w);
+endchar;
+
+beginsymbol(1/2delim_height#, vcentre((6 + 5.5)/2 * u# + line_thickness#)); "horizontal curly brace -- right";
+ draw_brace((w - 3delim_height, (h-d)/2), 6delim_height, h + d, -90, line_thickness, w, 0, 0);
+endchar;
+
+for sign = 1, -1:
+ beginsymbol(delim_height#, vcentre((6 + 5.5)/2 * u# + line_thickness#)); "horizontal curly brace -- middle";
+ draw_brace((w/2, (h-d)/2), 6delim_height, h + d, sign * 90, line_thickness, 0, w, 0);
+ endchar;
+endfor;
+
+beginsymbol(u#, vcentre((6 + 5.5)/2 * u# + line_thickness#)); "horizontal curly brace -- module";
+ y2 = y3 = (h - d)/2;
+ x2 = -1/2line_thickness;
+ x3 = w + 1/2line_thickness;
+
+ draw_line(z2, z3, false);
+endchar;
+
+% roots
+
+root_char = current_char + 1;
+
+for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((4scale + 2) * u# + 5/2line_thickness# + 2side_bearing#, rule_thickness#, 2scale * delim_height# - rule_thickness#); "root";
+ draw_root(line_thickness);
+ endchar;
+endfor;
+
+beginsymbol(14u# + 5/2line_thickness# + 2side_bearing#, rule_thickness#, 1.2delim_height# - rule_thickness#); "root -- top";
+ draw_root_top(line_thickness);
+endchar;
+
+beginsymbol(14u# + 5/2line_thickness# + 2side_bearing#, 0, 2.4delim_height#); "root -- bottom";
+ draw_root_bot(line_thickness);
+endchar;
+
+beginsymbol(14u# + 5/2line_thickness# + 2side_bearing#, vcentre(0.6delim_height#)); "root -- module";
+ x0 = x1 = 4/9w + 1/2line_thickness;
+ y0 = h;
+ y1 = -d;
+
+ draw_line(z0, z1, true);
+endchar;
+
+extensible current_char - 2: current_char - 2, 0, current_char - 1, current_char;
+charlist root_char: root_char + 1: root_char + 2: root_char + 3: root_char + 4: root_char + 5: current_char - 2;
+
+% more roots
+
+for scale = 1, 1.2, 1.5, 1.8, 2.4, 3:
+ beginsymbol((4scale + 2) * u# + 5/2line_thickness# + 2side_bearing#, vcentre(2scale * delim_height#)); "root";
+ draw_root(line_thickness);
+ endchar;
+endfor;
+
+beginsymbol(14u# + 5/2line_thickness# + 2side_bearing#, 1.2delim_height#, 0); "root -- top";
+ draw_root_top(line_thickness);
+endchar;
+
+beginsymbol(14u# + 5/2line_thickness# + 2side_bearing#, 2.4delim_height#, 0); "root -- bottom";
+ draw_root_bot(line_thickness);
+endchar;
diff --git a/fonts/fdsymbol/source/fdgeometric.mf b/fonts/fdsymbol/source/fdgeometric.mf
new file mode 100644
index 0000000000..6ac7e20eae
--- /dev/null
+++ b/fonts/fdsymbol/source/fdgeometric.mf
@@ -0,0 +1,1875 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+beginsymbol(2dot_size# + 2side_bearing#, vcentre(2dot_size#)); "centre dot";
+ fill dot((w/2, (h-d)/2), dot_size);
+endchar;
+
+for alpha = 0, 90, 45, 135:
+ beginsymbol((4dot_size# + equal_spread#) * abs (cosd alpha) + 2dot_size# * abs (sind alpha) + 2side_bearing#, vcentre(2dot_size# * abs (cosd alpha) + (4dot_size# + equal_spread#) * abs (sind alpha))); "colon (" & decimal alpha & ")";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+
+ z1 - z0 = (2dot_size + equal_spread) * dir alpha;
+ 1/2[z0,z1] = centre;
+
+ fill dot(z0, dot_size);
+ fill dot(z1, dot_size);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 45, 135:
+ beginsymbol((6dot_size# + 2equal_spread#) * abs (cosd alpha) + 2dot_size# * abs (sind alpha) + 2side_bearing#, vcentre(2dot_size# * abs (cosd alpha) + (6dot_size# + 2equal_spread#) * abs (sind alpha))); "triple colon (" & decimal alpha & ")";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+
+ z1 - z0 = (2dot_size + equal_spread) * dir alpha;
+ z2 - z1 = (2dot_size + equal_spread) * dir alpha;
+ z1 = centre;
+
+ fill dot(z0, dot_size);
+ fill dot(z1, dot_size);
+ fill dot(z2, dot_size);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "therefore (" & decimal alpha & ")";
+ r := 1/2plus_size - dot_size;
+ r := r * 1/3[1, sqrt 2];
+
+ z1 = z0 + r * dir alpha;
+ z2 = z0 + r * dir (alpha + 120);
+ z3 = z0 + r * dir (alpha + 240);
+
+ 1/2[z1,1/2[z2,z3]] = centre;
+
+ fill dot(z1, dot_size);
+ fill dot(z2, dot_size);
+ fill dot(z3, dot_size);
+ endchar;
+endfor;
+
+beginoperator(plus_size#, 1); "double colon";
+ r := (1/2plus_size - dot_size) * sqrt(2);
+
+ fill dot(centre + r * dir 45, dot_size);
+ fill dot(centre + r * dir 135, dot_size);
+ fill dot(centre + r * dir 225, dot_size);
+ fill dot(centre + r * dir 315, dot_size);
+endchar;
+
+beginoperator(plus_size#, 1); "minus";
+ draw_line(centre + radius * right, centre + radius * left, true);
+endchar;
+
+beginoperator(plus_size#, 1); "medium slash";
+ draw_line(centre + 4/3radius * dir 45, centre + 4/3radius * dir 225, true);
+endchar;
+
+beginoperator(plus_size#, 1); "medium backslash";
+ draw_line(centre + 4/3radius * dir 135, centre + 4/3radius * dir 315, true);
+endchar;
+
+beginoperator(plus_size#, 1); "plus";
+ draw_line(centre + radius * right, centre + radius * left, true);
+ draw_line(centre + radius * up, centre + radius * down, true);
+endchar;
+
+beginoperator(plus_size#, 1); "times";
+ r := 4/3radius;
+
+ draw_line(centre + r * dir 45, centre + r * dir 225, true);
+ draw_line(centre + r * dir 135, centre + r * dir 315, true);
+endchar;
+
+for angle = 0, 180:
+ beginoperator(plus_size#, 1); "dot minus (" & decimal angle & ")";
+ draw_line(centre - radius * dir angle, centre + radius * dir angle, true);
+ fill dot(centre + equal_spread * dir (angle + 90), 3/4dot_size);
+ endchar;
+endfor;
+
+beginoperator(plus_size#, 1); "divide";
+ draw_line(centre + radius * right, centre + radius * left, true);
+ fill dot(centre + equal_spread * up, 3/4dot_size);
+ fill dot(centre + equal_spread * down, 3/4dot_size);
+endchar;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "minus with two dots";
+ draw_line(centre + radius * right, centre + radius * left, true);
+ fill dot(centre + sign * (radius - 3/4dot_size) * left + equal_spread * up, 3/4dot_size);
+ fill dot(centre + sign * (radius - 3/4dot_size) * right + equal_spread * down, 3/4dot_size);
+ endchar;
+endfor;
+
+beginoperator(plus_size#, 1); "minus with four dots";
+ draw_line(centre + radius * right, centre + radius * left, true);
+ fill dot(centre + (radius - 3/4dot_size) * left + equal_spread * up, 3/4dot_size);
+ fill dot(centre + (radius - 3/4dot_size) * right + equal_spread * up, 3/4dot_size);
+ fill dot(centre + (radius - 3/4dot_size) * left + equal_spread * down, 3/4dot_size);
+ fill dot(centre + (radius - 3/4dot_size) * right + equal_spread * down, 3/4dot_size);
+endchar;
+
+for angle = 0, 180:
+ beginoperator(plus_size#, 1.25); "plus minus (" & decimal angle & ")";
+ centre := centre + 0.125plus_size * dir (angle + 90);
+ pair bt;
+ bt := centre + (radius + 0.25plus_size) * dir (angle - 90);
+
+ draw_line(centre + radius * right, centre + radius * left, true);
+ draw_line(centre + radius * up, centre + radius * down, true);
+ draw_line(bt + radius * right, bt + radius * left, true);
+ endchar;
+endfor;
+
+for angle = 0, 180:
+ beginoperator(plus_size#, 1.25); "dot plus (" & decimal angle & ")";
+ centre := centre + 0.125plus_size * dir (angle - 90);
+ pair tp;
+ tp := centre + (radius + 0.25plus_size) * dir (angle + 90);
+
+ draw_line(centre + radius * right, centre + radius * left, true);
+ draw_line(centre + radius * up, centre + radius * down, true);
+ fill dot(tp, 3/4dot_size);
+ endchar;
+endfor;
+
+beginoperator(plus_size#, 1.25); "dot times";
+ centre := centre + 0.125plus_size * down;
+ pair tp;
+ tp := centre + (radius + 0.2plus_size) * up;
+ r := 4/3radius;
+
+ draw_line(centre + r * dir 45, centre + r * dir 225, true);
+ draw_line(centre + r * dir 135, centre + r * dir 315, true);
+ fill dot(tp, 3/4dot_size);
+endchar;
+
+beginoperator(plus_size#, 1.25); "times bar";
+ centre := centre + 0.125plus_size * up;
+ pair bt;
+ bt := centre + (radius + 0.25plus_size) * down;
+ r := 4/3radius;
+
+ draw_line(centre + r * dir 45, centre + r * dir 225, true);
+ draw_line(centre + r * dir 135, centre + r * dir 315, true);
+ draw_line(bt + radius * right, bt + radius * left, true);
+endchar;
+
+beginoperator(plus_size#, 1); "divide on times";
+ r := 4/3radius;
+
+ draw_line(centre + radius * right, centre + radius * left, true);
+ draw_line(centre + r * dir 45, centre + r * dir 225, true);
+ draw_line(centre + r * dir 135, centre + r * dir 315, true);
+ fill dot(centre + equal_spread * up, 3/4dot_size);
+ fill dot(centre + equal_spread * down, 3/4dot_size);
+endchar;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "logical not";
+ draw_line(centre + radius * left, centre + radius * right, true);
+ draw_line(centre + sign * radius * right, centre + sign * radius * right + equal_spread * down, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "upside down logical not";
+ draw_line(centre + radius * left, centre + radius * right, true);
+ draw_line(centre + sign * radius * right, centre + sign * radius * right + equal_spread * up, true);
+ endchar;
+endfor;
+
+for sign = -1, 1:
+ beginoperator(plus_size#, 1); "three times";
+ r := 4/3radius;
+
+ z0 = centre + r * dir (sign * 45);
+ z1 = centre + r * dir (sign * 225);
+ z2 = centre + r * dir (270 + sign * 45);
+ z3 = centre + 1/4line_thickness * dir (270 + sign * 45);
+
+ draw_line(z0, z1, true);
+ draw_line(z3, z2, true);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "closed times (" & decimal alpha & ")";
+ thick := line_thickness;
+ r := 4/3radius;
+
+ z0 = centre + (r + 1/2line_thickness) * dir (alpha + 45);
+ z1 = centre + r * dir (alpha + 315);
+ z2 = centre + r * dir (alpha + 225);
+ z3 = centre + (r + 1/2line_thickness) * dir (alpha + 135);
+
+ penpos0(thick,alpha + 315);
+ penpos1(thick,alpha + 45);
+ penpos2(thick,alpha + 315);
+ penpos3(thick,alpha + 45);
+
+ z5 = z1r + whatever * dir (270 + alpha - 15);
+ z6 = z2l + whatever * dir (270 + alpha + 15);
+ z5 = whatever[z1r + thick * dir (270 + alpha), z2l + thick * dir (270 + alpha)];
+ z6 = whatever[z1r + thick * dir (270 + alpha), z2l + thick * dir (270 + alpha)];
+
+ fill stroke z0e -- z2e;
+ fill stroke z1e -- z3e;
+ fill z1r -- z5 -- z6 -- z2l -- cycle;
+
+ penlabels(0,1,2,3,5,6);
+ endchar;
+endfor;
+
+for alpha = 0, 90:
+ beginoperator(plus_size#, 1); "bowtie (" & decimal alpha & ")";
+ thick := line_thickness;
+ r := 4/3radius;
+
+ z0 = centre + r * dir (alpha + 135);
+ z1 = centre + r * dir (alpha + 45);
+ z2 = centre + r * dir (alpha + 315);
+ z3 = centre + r * dir (alpha + 225);
+
+ penpos0(thick,alpha + 45);
+ penpos1(thick,alpha + 135);
+ penpos2(thick,alpha + 45);
+ penpos3(thick,alpha + 135);
+
+ z4 = z0r + whatever * dir (180 + alpha + 15);
+ z5 = z1r + whatever * dir (alpha - 15);
+ z6 = z2l + whatever * dir (alpha + 15);
+ z7 = z3l + whatever * dir (180 + alpha - 15);
+ z4 = whatever[z0r + thick * dir (180 + alpha), z3l + thick * dir (180 + alpha)];
+ z5 = whatever[z1r + thick * dir alpha, z2l + thick * dir alpha];
+ z6 = whatever[z1r + thick * dir alpha, z2l + thick * dir alpha];
+ z7 = whatever[z0r + thick * dir (180 + alpha), z3l + thick * dir (180 + alpha)];
+
+ fill stroke z0e -- z2e;
+ fill stroke z1e -- z3e;
+ fill z1r -- z5 -- z6 -- z2l -- cycle;
+ fill z0r -- z4 -- z7 -- z3l -- cycle;
+
+ penlabels(0,1,2,3,4,5,6,7);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "Y (" & decimal alpha & ")";
+ s := 1/15plus_size;
+
+ draw_line(centre - s * dir alpha, centre + radius * dir alpha, true);
+ draw_line(centre - s * dir alpha, centre - s * dir alpha + (radius + s) * dir (alpha + 135), true);
+ draw_line(centre - s * dir alpha, centre - s * dir alpha + (radius + s) * dir (alpha + 225), true);
+ endchar;
+endfor;
+
+% operators
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "wedge";
+ draw_less(a, centre + sign * plus_size/2 * up, centre - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "wedge dot";
+ draw_less(a, centre + sign * plus_size/2 * up, centre - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ fill dot(centre - sign * 1/3plus_size * up, 3/4dot_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol(13/9plus_size# + 2side_bearing#, vcentre(plus_size#)); "double wedge";
+ 1/2[z0,z1] = (w/2, (h-d)/2);
+ z1 - z0 = 4/9plus_size * right;
+
+ draw_less(a, z0 + sign * plus_size/2 * up, z0 - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ draw_less(b, z1 + sign * plus_size/2 * up, z1 - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "curly wedge";
+ draw_prec(a, centre + sign * plus_size/2 * up, centre - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1.25); "bar wedge";
+ centre := centre - sign * 0.125plus_size * up;
+ pair tp;
+ tp := centre + sign * (radius + 0.25plus_size) * up;
+
+ draw_less(a, centre + sign * plus_size/2 * up, centre - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ draw_line(tp + radius * left, tp + radius * right, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1.5); "double bar wedge";
+ centre := centre - sign * 0.25plus_size * up;
+ pair tpa, tpb;
+ tpa := centre + sign * (radius + 0.25plus_size) * up;
+ tpb := centre + sign * (radius + 0.5plus_size) * up;
+
+ draw_less(a, centre + sign * plus_size/2 * up, centre - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ draw_line(tpa + radius * left, tpa + radius * right, true);
+ draw_line(tpb + radius * left, tpb + radius * right, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "union";
+ draw_subset(a,centre - sign * plus_size/2 * up, centre + sign * plus_size/2 * up, 2radius, line_thickness);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(4/3plus_size#, 1); "double union";
+ draw_subset(a, centre - sign * 5/18plus_size * up, centre + sign * 2/3plus_size * up, 5/6radius, line_thickness);
+ draw_subset(b, centre - sign * 2/3plus_size * up, centre + sign * 2/3plus_size * up, 2radius, line_thickness);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "union dot";
+ draw_subset(a, centre - sign * plus_size/2 * up, centre + sign * plus_size/2 * up, 2radius, line_thickness);
+ fill dot(centre + sign * 1/6plus_size * up, 3/4dot_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "union plus";
+ draw_subset(a, centre - sign * plus_size/2 * up, centre + sign * plus_size/2 * up, 2radius, line_thickness);
+
+ r := 1/6plus_size;
+
+ draw_line(centre + sign * 1/6plus_size * up + r * right, centre + sign * 1/6plus_size * up + r * left, true);
+ draw_line(centre + (r + sign * 1/6plus_size) * up, centre + (r - sign * 1/6plus_size) * down, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "square union";
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = sign * 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, false);
+ draw_line(z2, z3, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(4/3plus_size#, 1); "double square union";
+ z3a - z0a = z2a - z1a = 2radius * right;
+ z0a - z1a = sign * 2radius * up;
+ 1/2[1/2[z0a,z1a], 1/2[z2a,z3a]] = centre;
+ z3b - z0b = z2b - z1b = 5/9plus_size * right;
+ z0b - z1b = sign * 17/12radius * up;
+ y0b = y0a;
+ 1/2[x0b, x3b] = xpart centre;
+
+ draw_line(z0a, z1a, true);
+ draw_line(z1a, z2a, false);
+ draw_line(z2a, z3a, true);
+ draw_line(z0b, z1b, true);
+ draw_line(z1b, z2b, false);
+ draw_line(z2b, z3b, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "square union dot";
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = sign * 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, false);
+ draw_line(z2, z3, true);
+ fill dot(centre + sign * 1/6plus_size * up, 3/4dot_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "square union plus";
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = sign * 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, false);
+ draw_line(z2, z3, true);
+
+ r := 1/6plus_size;
+
+ draw_line(centre + sign * 1/6plus_size * up + r * right, centre + sign * 1/6plus_size * up + r * left, true);
+ draw_line(centre + (r + sign * 1/6plus_size) * up, centre + (r - sign * 1/6plus_size) * down, true);
+ endchar;
+endfor;
+
+for alpha = 0, 180:
+ beginoperator(plus_size#, 1); "corner with dot";
+ z3 - z0 = z2 - z1 = 2radius * dir alpha;
+ z0 - z1 = 2radius * dir (alpha + 90);
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z1, z2, true);
+ draw_line(z2, z3, true);
+ fill dot(centre, 3/4dot_size);
+ endchar;
+endfor;
+
+% triangles
+
+for alpha = 0, 90, 180, 270:
+ beginsymbol((3/4small_op_size# + 3/2line_thickness#) * abs(cosd alpha) + sqrt(3) * (small_op_size#/2 + line_thickness#) * abs(sind alpha) + 2side_bearing#, vcentre(sqrt(3) * (small_op_size#/2 + line_thickness#) * abs(cosd alpha) + (3/4small_op_size# + 3/2line_thickness#) * abs(sind alpha))); "small triangle (" & decimal alpha & ")";
+ thick := line_thickness;
+ radius := small_op_size/2;
+ centre := (w/2, (h - d)/2) - 1/4(radius + thick) * dir alpha;
+
+ draw_triangle(a, centre, radius, alpha, thick);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginsymbol((3/4small_op_size# + 3/2line_thickness#) * abs(cosd alpha) + sqrt(3) * (small_op_size#/2 + line_thickness#) * abs(sind alpha) + 2side_bearing#, vcentre(sqrt(3) * (small_op_size#/2 + line_thickness#) * abs(cosd alpha) + (3/4small_op_size# + 3/2line_thickness#) * abs(sind alpha))); "small filled triangle (" & decimal alpha & ")";
+ thick := line_thickness;
+ radius := small_op_size/2;
+ centre := (w/2, (h - d)/2) - 1/4(radius + thick) * dir alpha;
+
+ filldraw_triangle(a, centre, radius, alpha, thick);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginsymbol((3/4med_op_size# + 3/2line_thickness#) * abs(cosd alpha) + sqrt(3) * (med_op_size#/2 + line_thickness#) * abs(sind alpha) + 2side_bearing#, vcentre(sqrt(3) * (med_op_size#/2 + line_thickness#) * abs(cosd alpha) + (3/4med_op_size# + 3/2line_thickness#) * abs(sind alpha))); "medium triangle (" & decimal alpha & ")";
+ thick := line_thickness;
+ radius := med_op_size/2;
+ centre := (w/2, (h - d)/2) - 1/4(radius + thick) * dir alpha;
+
+ draw_triangle(a, centre, radius, alpha, thick);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginsymbol((3/4med_op_size# + 3/2line_thickness#) * abs(cosd alpha) + sqrt(3) * (med_op_size#/2 + line_thickness#) * abs(sind alpha) + 2side_bearing#, vcentre(sqrt(3) * (med_op_size#/2 + line_thickness#) * abs(cosd alpha) + (3/4med_op_size# + 3/2line_thickness#) * abs(sind alpha))); "medium filled triangle (" & decimal alpha & ")";
+ thick := line_thickness;
+ radius := med_op_size/2;
+ centre := (w/2, (h - d)/2) - 1/4(radius + thick) * dir alpha;
+
+ filldraw_triangle(a, centre, radius, alpha, thick);
+ endchar;
+endfor;
+
+for alpha = 90, 270:
+ beginsymbol(sqrt(3) * (large_op_size#/2 + line_thickness#) + 2side_bearing#, vcentre(3/4large_op_size# + 3/2line_thickness#)); "large triangle (" & decimal alpha & ")";
+ thick := line_thickness;
+ radius := large_op_size/2;
+ centre := (w/2, (h - d)/2) - 1/4(radius + thick) * dir alpha;
+
+ draw_triangle(a, centre, radius, alpha, thick);
+ endchar;
+endfor;
+
+% circles
+
+beginoperator(4/5small_op_size#, 1); "small circle";
+ draw_circle(centre, radius, line_thickness);
+endchar;
+
+beginoperator(4/5small_op_size#, 1); "small filled circle";
+ filldraw_circle(centre, radius, line_thickness);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle";
+ draw_circle(centre, radius, line_thickness);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium filled circle";
+ filldraw_circle(centre, radius, line_thickness);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle minus";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + radius * left, centre + radius * right, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle bar";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + radius * up, centre + radius * down, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle slash";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + radius * dir 45, centre + radius * dir 225, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle backslash";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + radius * dir 135, centre + radius * dir 315, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle plus";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + radius * left, centre + radius * right, false);
+ draw_line(centre + radius * up, centre + radius * down, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle times";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + radius * dir 45, centre + radius * dir 225, false);
+ draw_line(centre + radius * dir 135, centre + radius * dir 315, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle dot";
+ draw_circle(centre, radius, line_thickness);
+ fill dot(centre, dot_size);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle circle";
+ draw_circle(centre, radius, line_thickness);
+ draw_circle(centre, 2/5radius, line_thickness);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle asterisk";
+ thick := line_thickness;
+
+ draw_circle(centre, radius, thick);
+
+ penpos a0(4/3thick, 0);
+ penpos a1(4/3thick, 60);
+ penpos a2(4/3thick, 120);
+ penpos a3(4/3thick, 180);
+ penpos a4(4/3thick, 240);
+ penpos a5(4/3thick, 300);
+
+ penpos b0(2/3thick, 0);
+ penpos b1(2/3thick, 60);
+ penpos b2(2/3thick, 120);
+ penpos b3(2/3thick, 180);
+ penpos b4(2/3thick, 240);
+ penpos b5(2/3thick, 300);
+
+ reg_poly_points(a)(6, centre, radius, 90);
+
+ z.b0 = z.b1 = z.b2 = z.b3 = z.b4 = z.b5 = centre;
+
+ fill stroke z.a0e -- z.b0e;
+ fill stroke z.a1e -- z.b1e;
+ fill stroke z.a2e -- z.b2e;
+ fill stroke z.a3e -- z.b3e;
+ fill stroke z.a4e -- z.b4e;
+ fill stroke z.a5e -- z.b5e;
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle dash";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + 2/3radius * left, centre + 2/3radius * right, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle equal";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + 2/5equal_spread * up + 2/3radius * left, centre + 2/5equal_spread * up + 2/3radius * right, false);
+ draw_line(centre + 2/5equal_spread * down + 2/3radius * left, centre + 2/5equal_spread * down + 2/3radius * right, false);
+endchar;
+
+for sign = 1,-1:
+ beginoperator(4/5med_op_size#, 1); "negated medium circle";
+ r := 4/3radius;
+
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + r * dir (sign * 45), centre + r * dir (sign * 225), true);
+ endchar;
+endfor;
+
+beginoperator(4/5large_op_size#, 1); "large circle";
+ draw_circle(centre, radius, line_thickness);
+endchar;
+
+beginoperator(4/5large_op_size#, 1); "large filled circle";
+ filldraw_circle(centre, radius, line_thickness);
+endchar;
+
+% squares
+
+beginoperator(small_op_size#/sqrt(2), 1); "small square";
+ draw_square(centre, radius, 0, line_thickness);
+endchar;
+
+beginoperator(small_op_size#/sqrt(2), 1); "small filled square";
+ filldraw_square(centre, radius, 0, line_thickness);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square";
+ draw_square(centre, radius, 0, line_thickness);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium filled square";
+ filldraw_square(centre, radius, 0, line_thickness);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square minus";
+ draw_square(centre, radius, 0, line_thickness);
+ draw_line(centre + radius * right, centre + radius * left, false);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square vert";
+ draw_square(centre, radius, 0, line_thickness);
+ draw_line(centre + radius * up, centre + radius * down, false);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square slash";
+ r := radius * sqrt(2);
+
+ draw_square(centre, radius, 0, line_thickness);
+ draw_line(centre + r * dir 45, centre + r * dir 225, false);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square backslash";
+ r := radius * sqrt(2);
+
+ draw_square(centre, radius, 0, line_thickness);
+ draw_line(centre + r * dir 135, centre + r * dir 315, false);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square plus";
+ draw_square(centre, radius, 0, line_thickness);
+ draw_line(centre + radius * right, centre + radius * left, false);
+ draw_line(centre + radius * up, centre + radius * down, false);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square times";
+ r := radius * sqrt(2);
+
+ draw_square(centre, radius, 0, line_thickness);
+ draw_line(centre + r * dir 45, centre + r * dir 225, false);
+ draw_line(centre + r * dir 135, centre + r * dir 315, false);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square dot";
+ draw_square(centre, radius, 0, line_thickness);
+ fill dot(centre, dot_size);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square square";
+ draw_square(centre, radius, 0, line_thickness);
+ draw_square(centre, 2/5radius, 0, 4/5line_thickness);
+endchar;
+
+beginoperator(large_op_size#/sqrt(2), 1); "large square";
+ draw_square(centre, radius, 0, line_thickness);
+endchar;
+
+beginoperator(large_op_size#/sqrt(2), 1); "large filled square";
+ filldraw_square(centre, radius, 0, line_thickness);
+endchar;
+
+beginoperator(small_op_size#, 1); "small diamond";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+endchar;
+
+beginoperator(small_op_size#, 1); "small filled diamond";
+ filldraw_square(centre, radius / sqrt(2), 45, line_thickness);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium filled diamond";
+ filldraw_square(centre, radius / sqrt(2), 45, line_thickness);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond minus";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+ draw_line(centre + radius * right, centre + radius * left, false);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond vert";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+ draw_line(centre + radius * up, centre + radius * down, false);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond slash";
+ r := radius / sqrt(2);
+
+ draw_square(centre, r, 45, line_thickness);
+ draw_line(centre + r * dir 45, centre + r * dir 225, false);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond backslash";
+ r := radius / sqrt(2);
+
+ draw_square(centre, r, 45, line_thickness);
+ draw_line(centre + r * dir 135, centre + r * dir 315, false);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond plus";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+ draw_line(centre + radius * right, centre + radius * left, false);
+ draw_line(centre + radius * up, centre + radius * down, false);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond times";
+ r := radius / sqrt(2);
+
+ draw_square(centre, r, 45, line_thickness);
+ draw_line(centre + r * dir 45, centre + r * dir 225, false);
+ draw_line(centre + r * dir 135, centre + r * dir 315, false);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond dot";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+ fill dot(centre, dot_size);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond diamond";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+ draw_square(centre, 2/5radius / sqrt(2), 45, 4/5line_thickness);
+endchar;
+
+beginoperator(5/6small_op_size#, 8/5); "small lozenge";
+ x0 = w - x2 = side_bearing;
+ y0 = y2 = ypart centre;
+ x1 = x3 = xpart centre;
+ y1 = h;
+ y3 = -d;
+
+ theta := angle(z1 - z0);
+
+ x0' = x0 + line_thickness / sind theta;
+ x2' = x2 - line_thickness / sind theta;
+ y0' = y2' = y0;
+ y1' = y1 - line_thickness / cosd theta;
+ y3' = y3 + line_thickness / cosd theta;
+ x1' = x3' = x1;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+ unfill z0' -- z1' -- z2' -- z3' -- cycle;
+endchar;
+
+beginoperator(5/6small_op_size#, 8/5); "small filled lozenge";
+ x0 = w - x2 = side_bearing;
+ y0 = y2 = ypart centre;
+ x1 = x3 = xpart centre;
+ y1 = h;
+ y3 = -d;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+beginoperator(1/sqrt(2)*med_op_size#, 8/5); "medium lozenge";
+ x0 = w - x2 = side_bearing;
+ y0 = y2 = ypart centre;
+ x1 = x3 = xpart centre;
+ y1 = h;
+ y3 = -d;
+
+ theta := angle(z1 - z0);
+
+ x0' = x0 + line_thickness / sind theta;
+ x2' = x2 - line_thickness / sind theta;
+ y0' = y2' = y0;
+ y1' = y1 - line_thickness / cosd theta;
+ y3' = y3 + line_thickness / cosd theta;
+ x1' = x3' = x1;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+ unfill z0' -- z1' -- z2' -- z3' -- cycle;
+endchar;
+
+beginoperator(1/sqrt(2)*med_op_size#, 8/5); "medium filled lozenge";
+ x0 = w - x2 = side_bearing;
+ y0 = y2 = ypart centre;
+ x1 = x3 = xpart centre;
+ y1 = h;
+ y3 = -d;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+beginoperator(1/sqrt(2)*med_op_size#, 8/5); "medium lozenge minus";
+ thick := line_thickness;
+
+ x0 = w - x2 = side_bearing;
+ y0 = y2 = ypart centre;
+ x1 = x3 = xpart centre;
+ y1 = h;
+ y3 = -d;
+
+ theta := angle(z1 - z0);
+
+ x0' = x0 + thick / sind theta;
+ x2' = x2 - thick / sind theta;
+ y0' = y2' = y0;
+ y1' = y1 - thick / cosd theta;
+ y3' = y3 + thick / cosd theta;
+ x1' = x3' = x1;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+ unfill z0' -- z1' -- z2' -- z3' -- cycle;
+ draw_line(z0', z2', true);
+endchar;
+
+beginoperator(5/4small_op_size#, 1); "small star";
+ r := radius + line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre - t * up, r, 90);
+ reg_poly_points(b)(5, centre - t * up, .4r, 126);
+
+ s := r - 4/5line_thickness / sind (270 - angle (z.b0 - z.a0));
+
+ reg_poly_points(c)(5, centre - t * up, s, 90);
+ reg_poly_points(d)(5, centre - t * up, .4s, 126);
+
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+ unfill z.c0 -- z.d0 -- z.c1 -- z.d1 -- z.c2 -- z.d2 -- z.c3 -- z.d3 -- z.c4 -- z.d4 -- cycle;
+endchar;
+
+beginoperator(small_op_size#, 1); "small filled star";
+ r := radius + line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre - t * up, r, 90);
+ reg_poly_points(b)(5, centre - t * up, .4r, 126);
+
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+endchar;
+
+beginoperator(med_op_size#, 1); "medium star";
+ r := radius + line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre - t * up, r, 90);
+ reg_poly_points(b)(5, centre - t * up, .4r, 126);
+
+ s := r - line_thickness / sind (270 - angle (z.b0 - z.a0));
+
+ reg_poly_points(c)(5, centre - t * up, s, 90);
+ reg_poly_points(d)(5, centre - t * up, .4s, 126);
+
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+ unfill z.c0 -- z.d0 -- z.c1 -- z.d1 -- z.c2 -- z.d2 -- z.c3 -- z.d3 -- z.c4 -- z.d4 -- cycle;
+endchar;
+
+beginoperator(med_op_size#, 1); "medium filled star";
+ r := radius + line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre - t * up, r, 90);
+ reg_poly_points(b)(5, centre - t * up, .4r, 126);
+
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+endchar;
+
+beginoperator(large_op_size#, 1); "large star";
+ r := radius + line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre - t * up, r, 90);
+ reg_poly_points(b)(5, centre - t * up, .4r, 126);
+
+ s := r - line_thickness / sind (270 - angle (z.b0 - z.a0));
+
+ reg_poly_points(c)(5, centre - t * up, s, 90);
+ reg_poly_points(d)(5, centre - t * up, .4s, 126);
+
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+ unfill z.c0 -- z.d0 -- z.c1 -- z.d1 -- z.c2 -- z.d2 -- z.c3 -- z.d3 -- z.c4 -- z.d4 -- cycle;
+endchar;
+
+beginoperator(large_op_size#, 1); "large filled star";
+ r := radius + line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre - t * up, r, 90);
+ reg_poly_points(b)(5, centre - t * up, .4r, 126);
+
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+endchar;
+
+beginoperator(small_op_size#, 1); "asterisk";
+ r := w/2 - side_bearing;
+
+ penpos a0(4/3line_thickness, 0);
+ penpos a1(4/3line_thickness, 60);
+ penpos a2(4/3line_thickness, 120);
+ penpos a3(4/3line_thickness, 180);
+ penpos a4(4/3line_thickness, 240);
+ penpos a5(4/3line_thickness, 300);
+
+ penpos b0(2/3line_thickness, 0);
+ penpos b1(2/3line_thickness, 60);
+ penpos b2(2/3line_thickness, 120);
+ penpos b3(2/3line_thickness, 180);
+ penpos b4(2/3line_thickness, 240);
+ penpos b5(2/3line_thickness, 300);
+
+ reg_poly_points(a)(6, centre, r, 90);
+
+ z.b0 = z.b1 = z.b2 = z.b3 = z.b4 = z.b5 = centre;
+
+ fill stroke z.a0e -- z.b0e;
+ fill stroke z.a1e -- z.b1e;
+ fill stroke z.a2e -- z.b2e;
+ fill stroke z.a3e -- z.b3e;
+ fill stroke z.a4e -- z.b4e;
+ fill stroke z.a5e -- z.b5e;
+endchar;
+
+beginsymbol(18/10order_width# + 2side_bearing#, vcentre(2equal_spread# + line_thickness#)); "infinity";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+ thick := line_thickness;
+ alpha := 0;
+
+ z0 = centre - (9/10order_width - 1/2thick) * dir alpha;
+ z1 = centre + (9/10order_width - 1/2thick) * dir alpha;
+ z6 = 1/5[z0,z1];
+ z7 = 4/5[z0,z1];
+ z2 = z6 + equal_spread * dir (alpha + 90);
+ z3 = z6 - equal_spread * dir (alpha + 90);
+ z4 = z7 + equal_spread * dir (alpha + 90);
+ z5 = z7 - equal_spread * dir (alpha + 90);
+ z8 = z9 = centre;
+
+ penpos0(thick, alpha);
+ penpos1(thick, alpha);
+ penpos2(thick, alpha - 90);
+ penpos3(thick, alpha + 90);
+ penpos4(thick, alpha + 90);
+ penpos5(thick, alpha - 90);
+ penpos8(thick, alpha - 135);
+ penpos9(thick, alpha + 135);
+
+ fill stroke z4.e{dir (alpha + 180)}
+ .. {dir (alpha + 225)}z9.e
+ .. {dir (alpha + 180)}z3.e
+ .. {dir (alpha + 90)}z0.e
+ .. {dir alpha}z2.e
+ .. {dir (alpha - 45)}z8.e
+ .. {dir alpha}z5.e
+ .. {dir (alpha + 90)}z1.e
+ .. cycle;
+
+ penlabels (0,1,2,3,4,5,6,7,8,9);
+endchar;
+
+for alpha = 0, 180:
+ beginsymbol(16/10order_width# + 2side_bearing#, vcentre(2equal_spread# + line_thickness#)); "proportional";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+ thick := line_thickness;
+
+ z0 = centre - (8/10order_width - 1/2thick) * dir alpha;
+ z1 = centre + (7/10order_width - 1/2thick) * dir alpha;
+ z4 = z1 + equal_spread * dir (alpha + 90);
+ z5 = z1 - equal_spread * dir (alpha + 90);
+ z6 - z4 = z7 - z5 = (1/10order_width + 1/2thick) * dir alpha;
+ z10 = 1/4[z0,z1];
+ z2 = z10 + equal_spread * dir (alpha + 90);
+ z3 = z10 - equal_spread * dir (alpha + 90);
+ z8 = z9 = centre + 1/10order_width * dir alpha;
+
+ penpos0(thick, alpha);
+ penpos2(thick, alpha - 90);
+ penpos3(thick, alpha + 90);
+ penpos4(thick, alpha + 90);
+ penpos5(thick, alpha - 90);
+ penpos6(thick, alpha + 90);
+ penpos7(thick, alpha - 90);
+ penpos8(thick, alpha + 225);
+ penpos9(thick, alpha + 135);
+
+ fill stroke z6.e
+ -- z4.e{dir (alpha + 180)}
+ .. {dir (alpha + 225)}z9.e
+ .. {dir (alpha + 180)}z3.e
+ .. {dir (alpha + 90)}z0.e
+ .. {dir alpha}z2.e
+ .. {dir (alpha - 45)}z8.e
+ .. {dir alpha}z5.e
+ -- z7.e;
+
+ penlabels (0,1,2,3,4,5,6,7,8,9);
+ endchar;
+endfor;
+
+beginsymbol(14/10order_width# + 2side_bearing#, vcentre(2equal_spread# + line_thickness#)); "crossing";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+ thick := line_thickness;
+ alpha := 0;
+
+ z0 = centre - (6/10order_width - 1/2thick) * dir alpha;
+ z1 = centre + (6/10order_width - 1/2thick) * dir alpha;
+ z2 = z0 + equal_spread * dir (alpha + 90);
+ z3 = z0 - equal_spread * dir (alpha + 90);
+ z4 = z1 + equal_spread * dir (alpha + 90);
+ z5 = z1 - equal_spread * dir (alpha + 90);
+ z6 - z4 = z7 - z5 = (1/10order_width + 1/2thick) * dir alpha;
+ z2 - z8 = z3 - z9 = (1/10order_width + 1/2thick) * dir alpha;
+ z10 = z11 = 1/2[z0,z1];
+
+ penpos2(thick, alpha + 90);
+ penpos3(thick, alpha + 90);
+ penpos4(thick, alpha + 90);
+ penpos5(thick, alpha + 90);
+ penpos6(thick, alpha + 90);
+ penpos7(thick, alpha + 90);
+ penpos8(thick, alpha + 90);
+ penpos9(thick, alpha + 90);
+ penpos10(thick, alpha + 45);
+ penpos11(thick, alpha + 135);
+
+ fill stroke z6.e
+ -- z4.e{dir (alpha + 180)}
+ .. {dir (alpha + 225)}z11.e
+ .. {dir (alpha + 180)}z3.e
+ -- z9.e;
+ fill stroke z8.e
+ -- z2.e{dir alpha}
+ .. {dir (alpha - 45)}z10.e
+ .. {dir alpha}z5.e
+ -- z7.e;
+
+ penlabels (0,1,2,3,4,5,6,7,8,9,10,11);
+endchar;
+
+beginsymbol(equal_spread# + line_thickness# + 2side_bearing#, vcentre(med_op_size#)); "between";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+ r := med_op_size/2;
+
+ z0 = centre;
+ z1 = centre;
+
+ draw_smile(a, 1, z0 - r * up, z0 + r * up, equal_spread, line_thickness, true);
+ draw_smile(b, -1, z1 - r * up, z1 + r * up, equal_spread, line_thickness, true);
+endchar;
+
+beginsymbol(2equal_spread# + 2side_bearing#, x_height#, desc_depth#); "intercalate";
+ z1 - z0 = z3 - z2 = (2equal_spread - line_thickness) * right;
+ z2 - z0 = (h + d - line_thickness) * up;
+
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = (w/2, (h-d)/2);
+
+ draw_line(z2, z3, true);
+ draw_line(1/2[z0,z1], 1/2[z2,z3], true);
+endchar;
+
+beginsymbol(2/3equal_spread# + line_thickness# + 2side_bearing#, vcentre(plus_size#)); "wreath";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+
+ draw_sim(a, centre + 1/2plus_size * up, centre - 1/2plus_size * up, 1/3equal_spread, thick);
+endchar;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "angle";
+ z0 = centre + (plus_size - line_thickness)/2 * down;
+ z1 = z0 + sign * 1/2plus_size * right;
+ z2 = z0 + sign * 1/2plus_size * left;
+ x3 = xpart centre + sign * 1/2plus_size;
+ y3 = ypart centre + 2/3plus_size;
+ z4 = 4/5[z2,z3];
+ z5 = z4l + whatever * (z2 - z4);
+ z5 = z1r + whatever * right;
+ z6 = z4r + whatever * (z2 - z4);
+ z6 = z1r + whatever * right;
+ z7 = z1l + whatever * right;
+ z7 = z6 + whatever * dir (90 + sign * 17);
+
+ penpos1(line_thickness, 90);
+ penpos4(line_thickness, angle(z3 - z2) + sign * 90);
+
+ fill z1r -- z5 -- z4l -- z4r -- z6 -- z7 -- z1l -- cycle;
+
+ penlabels(1,2,3,4,5,6,7);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "measured angle";
+ z0 = centre + (plus_size - line_thickness)/2 * down;
+ z1 = z0 + sign * 1/2plus_size * right;
+ z2 = z0 + sign * 1/2plus_size * left;
+ x3 = xpart centre + sign * 1/2plus_size;
+ y3 = ypart centre + 2/3plus_size;
+ z4 = 4/5[z2,z3];
+ z5 = z4l + whatever * (z2 - z4);
+ z5 = z1r + whatever * right;
+ z6 = z4r + whatever * (z2 - z4);
+ z6 = z1r + whatever * right;
+ z7 = z1l + whatever * right;
+ z7 = z6 + whatever * dir (90 + sign * 17);
+ z8 = 2/3[z2,z1];
+ z9 = z2 + sign * ((z8 - z2) rotated angle (z3 - z2));
+
+ penpos1(line_thickness, 90);
+ penpos4(line_thickness, angle(z3 - z2) + sign * 90);
+ penpos8(line_thickness, 90 - sign * 90);
+ penpos9(line_thickness, angle(z3 - z2));
+
+ fill z1r -- z5 -- z4l -- z4r -- z6 -- z7 -- z1l -- cycle;
+ fill stroke z8.e{up} .. {dir (angle (z3 - z2) + sign * 90)}z9.e;
+
+ penlabels(1,2,3,4,5,6,7,8,9);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "spherical angle (" & decimal alpha & ")";
+ draw_less(a, centre - 1/2plus_size * dir alpha, centre + 1/2plus_size * dir alpha, 2radius, line_thickness, false);
+ z3 = 2/3[z2a, z0a];
+ z4 = 2/3[z2a, z1a];
+
+ penpos3(line_thickness, alpha + 35);
+ penpos4(line_thickness, alpha - 35);
+
+ fill stroke z4.e{dir (alpha + 55)} .. {dir (alpha + 125)}z3.e;
+
+ penlabels(3,4);
+ endchar;
+endfor;
+
+beginoperator(plus_size#, 1); "right angle";
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, true);
+endchar;
+
+beginoperator(plus_size#, 1); "measured right angle";
+ thick := line_thickness;
+
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+ z4 = 3/5[z1,z0] + (1/2thick - eps) * right;
+ z5 = 3/5[z1,z2] + (1/2thick - eps) * up;
+
+ penpos4(thick, 90);
+ penpos5(thick, 0);
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, true);
+ fill stroke z4.e{right} .. {down}z5.e;
+
+ penlabels(0,1,2,3,4,5);
+endchar;
+
+beginoperator(plus_size#, 1); "squared right angle";
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+ z4 = 1/2[z1,z0];
+ z5 = 1/2[z1,z2];
+
+ penpos4(line_thickness, 90);
+ penpos5(line_thickness, 0);
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, true);
+ draw_line(z4, centre, true);
+ draw_line(z5, centre, true);
+
+ penlabels(0,1,2,3,4,5);
+endchar;
+
+beginoperator(plus_size#, 1); "right angle with dot";
+ thick := line_thickness;
+
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+ z4 = 3/5[z1,z0] + (1/2thick - eps) * right;
+ z5 = 3/5[z1,z2] + (1/2thick - eps) * up;
+ z6 = 1/4[z1,z3];
+
+ penpos4(line_thickness, 90);
+ penpos5(line_thickness, 0);
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, true);
+ fill stroke z4.e{right} .. {down}z5.e;
+ fill dot(z6, 1/2dot_size);
+
+ penlabels(0,1,2,3,4,5);
+endchar;
+
+beginsymbol(3u# + line_thickness#, 4/5asc_height#, 0); "prime";
+ z0 = (w, h);
+ z1 = z0 + (u + line_thickness) * left;
+ z2 = (1u, 1/9h);
+ z3 = z2 + 4/3line_thickness * right;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+beginsymbol(3u# + line_thickness#, 4/5asc_height#, 0); "backprime";
+ z0 = (0, h);
+ z1 = z0 + (u + line_thickness) * right;
+ z2 = (w - 1u, 1/9h);
+ z3 = z2 + 4/3line_thickness * left;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+for sign = 1, -1:
+ for serifs = true, false:
+ beginoperator(plus_size#, 1); "product";
+ draw_product(centre, plus_size, plus_size, sign, line_thickness, serifs);
+ endchar;
+ endfor;
+endfor;
+
+beginsymbol(2/5asc_height# + 2side_bearing#, asc_height#, 0); "small integral";
+ pair centre;
+ centre := (w/2, (h - d)/2);
+
+ draw_integral(a, 1/2, centre, line_thickness);
+endchar;
+
+beginsymbol(11u# + line_thickness# + 2side_bearing#, asc_height#, 0); "check mark";
+ thick := line_thickness;
+
+ x1l = side_bearing;
+ y1 = math_axis;
+ x2 = side_bearing + 3u;
+ y2 = -d;
+ x3 = w -x2;
+ y3 = h;
+ x4r = w - side_bearing;
+ y4l = h;
+ z5r = 1/10[z4r,z1r];
+
+ theta := angle(z3 - z2);
+
+ penpos1(4/3thick, 30);
+ penpos2(thick, 0);
+ penpos3(thick, -90 + theta);
+ penpos4(1/3thick, -80);
+ penpos5(thick, -50);
+
+ z6 = z1r + whatever * (z2l - z1l);
+ z6 = z3l + whatever * (z3r - z2r);
+
+ fill z1l -- z2l -- z2r{z3r - z2r} .. {dir 40}z5r .. z4r -- z4l{dir 180} ... z5l{dir 220} .. {z2l - z3l}z6 -- z1r -- cycle;
+
+ penlabels(1,2,3,4,5,6);
+endchar;
+
+beginsymbol(6u# + line_thickness# + 2side_bearing#, 5/4asc_height#, 1/8asc_height#); "lightning";
+ thick := line_thickness;
+
+ x3r = w - side_bearing;
+ x2l = side_bearing + u;
+ x4 = 1/3w;
+ y1l = h;
+ y3r = 14/24h;
+ y4 = -d + 1/2thick;
+ z6 - z5 = whatever * dir 15;
+
+ penpos1(3/2thick, -20);
+ penpos2(3/2thick, 15);
+ penpos3(2thick, 15);
+ penpos4(thick, -20);
+ penpos5(thick, -75);
+ penpos6(thick, -75);
+
+ z1 - z2 = whatever * (z4 - z3);
+ z5r = z2;
+ z6l = z3;
+ z7 = whatever[z1r,z2r];
+ z7 = whatever[z5l,z6l];
+ z8 = whatever[z4l,z3l];
+ z8 = whatever[z6r,z5r];
+
+ fill z1l -- z2l -- z8 -- z4l -- z4r -- z3r -- z7 -- z1r -- cycle;
+ draw_arrowhead(z4, angle (z4l - z3l), 4/5arrow_spread, thick);
+
+ penlabels(1,2,3,4,7,8);
+endchar;
+
+for filled = false, true:
+ beginsymbol(13u#, cap_height#, 0); "diamond suit";
+ thick := line_thickness;
+ bend := 5;
+
+ x0 = x2 = x4 = x6 = w/2;
+ 1/2[y0,y2] = 1/2[y4,y6] = h/2;
+ y2 - y0 = h;
+ 1/2[x1,x3] = 1/2[x5,x7] = w/2;
+ x3 - x1 = w - 2side_bearing;
+ y1 = y3 = y5 = y7 = h/2;
+
+ theta := angle(z2 - z1);
+
+ y6 - y4 = h - 2thick / cosd theta;
+ x7 - x5 = w - 2side_bearing - 2thick / sind theta;
+
+ fill z0{dir (180-theta-bend)} .. {dir (180-theta+bend)}z1{dir (theta-bend)} .. {dir (theta+bend)}z2{dir (-theta-bend)} .. {dir (-theta+bend)}z3{dir (180+theta-bend)} .. {dir (180+theta+bend)}z0 & cycle;
+ if not filled:
+ unfill z4{dir (180-theta-bend)} .. {dir (180-theta+bend)}z5{dir (theta-bend)} .. {dir (theta+bend)}z6{dir (-theta-bend)} .. {dir (-theta+bend)}z7{dir (180+theta-bend)} .. {dir (180+theta+bend)}z4 & cycle;
+ fi;
+ labels(0,1,2,3,4,5,6,7);
+ endchar;
+endfor;
+
+for filled = false, true:
+ beginsymbol(14u#, cap_height#, 0); "heart suit";
+ thick := line_thickness;
+
+ x0 = x1l = x1'l = w/2;
+ y0 = 0;
+ 1/2[x2l,x3l] = w/2;
+ x3l - x2l = w - 2side_bearing;
+ y1r = y1'r;
+ y2l = y3l = 3/4h;
+ x4 = 1/2[x1,x2];
+ x5 = 1/2[x1',x3];
+ y4l = y5l = h;
+ h - y2 = 2(h - y1l);
+
+ penpos1(thick, 180+45);
+ penpos1'(thick, -45);
+ penpos2(thick, 0);
+ penpos3(thick, 180);
+ penpos4(thick, -90);
+ penpos5(thick, -90);
+
+ path p[];
+ numeric t[];
+
+ z6 = z1r + whatever * dir (270+45);
+ z6 = z1'r + whatever * dir (270-45);
+ z7 = z0 + thick * dir 20;
+ z8 = z0 + thick * dir (180-20);
+ p1 = z7{dir (90+35)} .. {dir 90}z2r;
+ p2 = z3r{dir 270} .. {dir (270-35)}z8;
+ (t1,t2) = p1 intersectiontimes p2;
+
+ fill z0{dir (90+35)} .. {dir 90}z2l .. {dir 0}z4l .. {dir (270+45)}z1l{dir (90-45)} .. {dir 0}z5l .. {dir 270}z3l .. {dir (270-35)}z0 & cycle;
+ if not filled:
+ unfill subpath (t1,1) of p1 & z2r{dir 90} .. {dir 0}z4r .. {dir (270+45)}z1r -- z6 -- z1'r{dir (90-45)} .. {dir 0}z5r .. {dir 270}z3r & subpath (0,t2) of p2 -- cycle;
+ fi;
+
+ penlabels(0,1,1',2,3,4,5,6,7,8);
+ endchar;
+endfor;
+
+beginsymbol(13u#, cap_height#, 0); "spade suit";
+ x0 = x1 = w/2;
+ y0 = h;
+ 1/2[x2,x3] = w/2;
+ x3 - x2 = w - 2side_bearing;
+ y2 = y3;
+ x4 = 1/2[x1,x2];
+ x5 = 1/2[x1,x3];
+ y4 = y5 = 1/6h;
+ y2 - y4 = x4 - x2;
+ y1 = 3/5[y2,y4];
+ x6 = x0;
+ y6 = 0;
+
+ penpos1(2u, 0);
+ penpos6(3u, 0);
+
+ fill z0{dir (270-30)} .. z2 .. z4 .. {dir (90-30)}z1l
+ -- z1r{dir (270+30)} .. z5 .. z3 .. {dir (90+30)}z0 -- cycle;
+ fill stroke z1e -- z6e;
+
+ penlabels(0,1,2,3,4,5,6);
+endchar;
+
+beginsymbol(14u#, cap_height#, 0); "club suit";
+ r := 1/4(w - 2side_bearing);
+
+ x0 = w/2;
+ y0 = h - 2.5r;
+ x1 = w - x3 = side_bearing + r;
+ y1 = y3 = y0;
+ x2 = x4 = x0;
+ y2 = h - r;
+ y4 = 0;
+
+ penpos0(3/2u, 0);
+ penpos2(3/2u, 0);
+ penpos4(3u, 0);
+
+ fill circle(z1, r);
+ fill circle(z2, r);
+ fill circle(z3, r);
+ fill stroke z2e -- z0e -- z4e;
+
+ penlabels(0,1,2,3,4);
+endchar;
+
+beginoperator(med_op_size#, 1); "maltese";
+ r := 1/2med_op_size;
+ thick := line_thickness;
+
+ 1/2[z0,z1] = centre + r * left;
+ 1/2[z2,z3] = centre + r * down;
+ 1/2[z4,z5] = centre + r * right;
+ 1/2[z6,z7] = centre + r * up;
+ z0 - z1 = z5 - z4 = r * up;
+ z3 - z2 = z6 - z7 = r * right;
+ 1/2[z8,z9] = centre + 1/2thick * up;
+ 1/2[z10,z11] = centre - 1/2thick * up;
+ z9 - z8 = z11 - z10 = 2thick * right;
+ 1/2[z12,z13] = centre + thick * up;
+ 1/2[z14,z15] = centre - thick * up;
+ z13 - z12 = z15 - z14 = thick * right;
+
+ fill z0 -- z1 -- z10 -- z11 -- z4 -- z5 -- z9 -- z8 -- cycle;
+ fill z6 -- z7 -- z12 -- z14 -- z2 -- z3 -- z15 -- z13 -- cycle;
+
+ labels(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
+endchar;
+
+beginoperator(med_op_size#, 2/sqrt(3)); "star of david";
+ r := med_op_size/sqrt(3);
+
+ reg_poly_points(a)(6, centre, r, 90);
+
+ s := r - 4/5line_thickness / sind (270 - angle (z.a2 - z.a0));
+
+ reg_poly_points(b)(6, centre, s, 90);
+
+ z0.r = z.a0; z0.l = z.b0;
+ z1.r = z.a2; z1.l = z.b2;
+ z2.r = z.a4; z2.l = z.b4;
+ z3.r = z.a1; z3.l = z.b1;
+ z4.r = z.a3; z4.l = z.b3;
+ z5.r = z.a5; z5.l = z.b5;
+
+ fill stroke z0.e -- z1.e -- z2.e -- cycle;
+ fill stroke z4.e -- z5.e -- z3.e -- cycle;
+
+ penlabels(0,1,2,3,4,5);
+endchar;
+
+beginoperator(plus_size#, 1); "sector";
+ thick := line_thickness;
+ alpha := 90;
+
+ z0 = centre - 1/2plus_size * dir alpha;
+ z1 = z0 + 9/10plus_size * dir alpha;
+
+ draw_less(a, z0, z1, 9/10plus_size, thick, false);
+
+ theta := angle(z0a - z2a) - alpha;
+
+ z0a = z4r;
+ z0a.r = z4'.r;
+ z1a = z5r;
+ z1a.r = z5'.r;
+
+ penpos4(thick, alpha + theta);
+ penpos4'(thick, alpha + theta);
+ penpos5(thick, alpha - theta);
+ penpos5'(thick, alpha - theta);
+
+ fill stroke z4e -- z4'.e{dir (alpha + theta - 90)} .. {dir(alpha - theta - 90)}z5'.e -- z5e;
+
+ penlabels(4,5);
+endchar;
+
+beginsymbol(5/4order_width# + 2side_bearing#, cap_height#, 0); "forall";
+ thick := 5/4line_thickness;
+
+ x0 = side_bearing + 1/2thick;
+ x1 = w - side_bearing - 1/2thick;
+ x2 = w/2 - 1/4thick;
+ x3 = w/2 + 1/4thick;
+ y0 = y1 = h;
+ y2 = y3 = 0;
+
+ penpos0(thick * cosd(angle(z2 - z0) + 90), 0);
+ penpos1(thick * cosd(angle(z2 - z0) + 90), 0);
+
+ z4 = z0l + whatever * (z2 - z0) = z2 + whatever * right;
+ z5 = z1r + whatever * (z3 - z1) = z2 + whatever * right;
+ z6 = z0r + whatever * (z2 - z0) = z1l + whatever * (z3 - z1);
+ z7 = whatever [z0,z2];
+ z8 = whatever [z1,z2];
+ y7 = y8 = 0.6 * y0;
+
+ fill z0l -- z4 -- z5 -- z1r -- z1l -- z6 -- z0r -- cycle;
+ draw_line(z7, z8, false);
+
+ penlabels(0,1,2,3,4,5,6,7,8);
+endchar;
+
+for negated = 0, 1:
+ beginsymbol(order_width# + 2side_bearing#, if negated = 0: cap_height# else: cap_height# + 2/3equal_spread# fi, if negated = 0: 0 else: 2/3equal_spread# fi); "exists";
+ thick := 5/4line_thickness;
+
+ x1 = x3 = w - side_bearing - thick/2;
+ y1 = cap_height;
+ y3 = 0;
+ x1' = x3' = w - side_bearing;
+ x0 = x2 = side_bearing;
+ y0 = y1' = cap_height - line_thickness/2;
+ y2 = y3' = line_thickness/2;
+ z4 = 1/8[1/2[z0,z2], 1/2[z1,z3]];
+
+ draw_straight(z1, z3, thick, false);
+ draw_line(z0, z1', false);
+ draw_line(z4, 1/2[z1,z3], false);
+ draw_line(z2, z3', false);
+
+ if negated = 1:
+ stroke_through(1/2[1/2[z0,z2], 1/2[z1,z3]], h + d - stroke_through_thickness)
+ fi;
+ endchar;
+endfor;
+
+beginsymbol(order_width# + 2side_bearing#, cap_height#, 0); "exists finitely many";
+ thick := 5/4line_thickness;
+
+ x1 = x3 = w - side_bearing - thick/2;
+ y1 = cap_height;
+ y3 = 0;
+ x3' = w - side_bearing;
+ x0 = x2 = side_bearing;
+ y0 = cap_height - line_thickness/2;
+ y2 = y3' = line_thickness/2;
+ z4 = 1/8[1/2[z0,z2], 1/2[z1,z3]];
+
+ draw_straight(z1, z3, thick, false);
+ draw_line(z4, 1/2[z1,z3], false);
+ draw_line(z2, z3', false);
+endchar;
+
+beginsymbol(5/4order_width# + 2side_bearing#, cap_height#, 0); "game quantifier";
+ thick := 5/4line_thickness;
+
+ x0 = x1 = 1/2order_width + side_bearing;
+ y0 = cap_height - 1/2thick;
+ y1 = 1/2line_thickness;
+ x2 = w - side_bearing - 1/2thick;
+ y2 = (h - d)/2;
+ x3r = x4r = side_bearing;
+ y3 = 5/6cap_height;
+ y4 = 1/6cap_height;
+
+ penpos0(thick, 90);
+ penpos1(thick, -90);
+ penpos2(thick, 0);
+ penpos3(thick, 125);
+ penpos4(thick, -125);
+
+ fill stroke z3.e .. z0.e .. z2.e{down} .. z1.e{left} .. z4.e;
+ draw_straight(z4r + 1/2thick * right, 2/5[z4r,z3r] + 1/2thick * right, thick, false);
+ draw_line(2/5[z4r,z3r], 2/5[z4r,z3r] + 1/2order_width * right, false);
+
+ penlabels(0,1,2,3,4);
+endchar;
+
+beginsymbol(7/8order_width# + 2side_bearing#, cap_height#, 0); "complement";
+ thick := 5/4line_thickness;
+
+ z0 - z1 = (cap_height - thick) * up;
+ z3 - z2 = (w - 2side_bearing - thick) * right;
+ 1/2[z0,z1] = 1/2[z2,z3] = (w/2,(h-d)/2);
+ x4 = x6 = x2;
+ x5 = x7 = x3;
+ y4 = y5 = 1/4[y0,y1];
+ y6 = y7 = 3/4[y0,y1];
+
+ penpos0(thick, 90);
+ penpos1(thick, -90);
+ penpos4(thick, -180);
+ penpos5(thick, 0);
+ penpos6(thick, -180);
+ penpos7(thick, 0);
+
+ fill stroke z5.e{up} .. z0.e .. {down}z4.e -- z6.e{down} .. z1.e .. {up}z7.e;
+
+ penlabels(0,1,2,3,4,5,6,7);
+endchar;
+
+beginsymbol(5u# + line_thickness# + 2side_bearing#, asc_height#, 1/2line_thickness#); "flat";
+ thick := line_thickness;
+
+ x0l = x1l = side_bearing;
+ x4l = x5 = side_bearing + thick;
+ y0 = -d;
+ y1 = h;
+ x2r = w - side_bearing;
+ x3 = w/2;
+ y3r = x_height;
+ y2 = 1/2[y0,y1];
+ y4r = 5/6x_height;
+ y5 = thick * (1 + sind 35) / cosd 35 - d;
+
+ penpos0(thick, 0);
+ penpos1(thick, 0);
+ penpos2(4/3thick, 0);
+ penpos3(thick, 90);
+ penpos4(thick, 130);
+
+ fill z1.l -- z0.l{dir 35} ... {up}z2.r .. {left}z3.r ..{dir 230}z4.r -- z4.l{dir 50} .. {right}z3.l .. {down}z2.l .. {dir 215}z5 -- z1.r -- cycle;
+
+ penlabels (0,1,2,3,4,5);
+endchar;
+
+beginsymbol(5u# + line_thickness# + 2side_bearing#, asc_height#, desc_depth#); "natural";
+ thick := line_thickness;
+
+ x0l = x1l = w - x2r = w - x3r = side_bearing;
+ x4 = x5 = w - x6 = w - x7 = side_bearing;
+ y1 = y3 = h;
+ y7r = x_height;
+ y4l = 0;
+ y0 = y2 = -d;
+ z6 = z4 + whatever * dir 15;
+ z5 = z7 + whatever * dir 15;
+
+ penpos0(thick, 0);
+ penpos1(thick, 0);
+ penpos2(thick, 0);
+ penpos3(thick, 0);
+ penpos4(3/2thick, 90);
+ penpos5(3/2thick, 90);
+ penpos6(3/2thick, 90);
+ penpos7(3/2thick, 90);
+
+ z8 = whatever[z0,z1] = whatever[z4,z6];
+ z9 = whatever[z2,z3] = whatever[z5,z7];
+
+ penpos8(thick, 0);
+ penpos9(thick, 0);
+
+ fill stroke z1e -- z8e;
+ fill stroke z9e -- z2e;
+ fill stroke z4e -- z6e;
+ fill stroke z5e -- z7e;
+
+ penlabels(1,2,4,5,6,7);
+endchar;
+
+beginsymbol(5u# + line_thickness# + 2side_bearing#, asc_height#, desc_depth#); "sharp";
+ thick := line_thickness;
+
+ x0l - x4 = x1l - x5 = x6 - x2r = x7 - x3r;
+ x2l - x0r = x3l - x1r = 2(x0l - x4);
+ x4 = x5 = w - x6 = w - x7 = side_bearing;
+ y3 = h;
+ y7r = x_height;
+ y4l = 0;
+ y0 = -d;
+ z2 = z0 + whatever * dir 20;
+ z1 = z3 + whatever * dir 20;
+ z6 = z4 + whatever * dir 15;
+ z5 = z7 + whatever * dir 15;
+
+ penpos0(thick, 0);
+ penpos1(thick, 0);
+ penpos2(thick, 0);
+ penpos3(thick, 0);
+ penpos4(3/2thick, 90);
+ penpos5(3/2thick, 90);
+ penpos6(3/2thick, 90);
+ penpos7(3/2thick, 90);
+
+ fill stroke z0e -- z1e;
+ fill stroke z2e -- z3e;
+ fill stroke z4e -- z6e;
+ fill stroke z5e -- z7e;
+
+ penlabels (0,1,2,3,4,5,6,7);
+endchar;
+
+beginsymbol(9u# + line_thickness# + 2side_bearing#, cap_height#, 0); "aleph";
+ thick := line_thickness;
+
+ x0l = x2l = side_bearing;
+ x1r = x3r = w - side_bearing;
+ y0 = h;
+ y1 = h;
+ y2 = 0;
+ y3 = 0;
+
+ penpos0(3/2thick, 20);
+ penpos1(4/3thick, 2);
+ penpos2(3/2thick, 0);
+ penpos3(4/3thick, 20);
+
+ path p;
+ p = z0{dir -70} .. {dir -70}z3;
+
+ z4 = point 3/10 of p;
+ z5 = point 5/8 of p;
+
+ penpos4(5/4thick, -40);
+ penpos5(5/4thick, -45);
+
+ fill stroke z0.e{dir -70} .. {dir -70}z3.e;
+ fill stroke z2.e{up} .. {dir 50}z4.e;
+ fill stroke z5.e{dir 45} .. {up}z1.e;
+
+ penlabels(0,1,2,3,4,5);
+endchar;
+
+beginsymbol(9u# + line_thickness# + 2side_bearing#, cap_height#, 0); "beth";
+ thick := line_thickness;
+
+ x0 = u + side_bearing;
+ x1 = 5/8[x2,x4];
+ x2 = side_bearing;
+ x3 = w - side_bearing;
+ y0r = h;
+ y1r = h;
+ y2l = 0;
+ y3l = 0;
+ z4r = 7/8[z2,z3];
+ x5 = x4;
+ y5 = 2/3h;
+
+ penpos0(3/2thick, 75);
+ penpos1(3/2thick * sind 75, 90);
+ penpos2(3/2thick, 75);
+ penpos3(3/2thick, 75);
+ penpos4(5/4thick, 0);
+ penpos5(5/4thick, 0);
+
+ fill stroke z2.e -- z3.e;
+ fill stroke z0.e -- z1.e{right} ..tension3/4.. {down}z5.e -- z4.e;
+
+ penlabels(0,1,2,3,4,5);
+endchar;
+
+beginsymbol(6u# + line_thickness# + 2side_bearing#, cap_height#, 0); "gimel";
+ thick := line_thickness;
+
+ x0 = x2 = side_bearing;
+ x2'r = 1/8[x0,x1];
+ x1 = x3r = w - side_bearing;
+ x4 = 1/4[x0,x1];
+ x5 = 1/2[x0,x1];
+ x6 = 2/3[x0,x1];
+ y0 = y1 = h;
+ y2l = y3 = 0;
+ y2' = y2;
+ y4r = h + 1/4thick;
+ z5 = z4 + whatever * dir -30;
+ y6 = 2/3h;
+
+ penpos2(4/3thick, 80);
+ penpos2'(4/3thick * sind 80, 90);
+ penpos3(4/3thick, 0);
+ penpos4(3/2thick, 60);
+ penpos5(3/2thick, 60);
+ penpos6(5/4thick, 0);
+
+ path p;
+ p = z6{dir -82} .. {dir -67}z3;
+ z7 = point 1/4 of p;
+ x8 = 2/5[x0,x1];
+ z7 = z8 + whatever * dir 60;
+
+ penpos7(thick, 150);
+ penpos8(thick, 150);
+
+ fill stroke z4.e -- z5.e{dir -30} .. {dir -82}z6.e .. {dir -67}z3.e;
+ fill stroke z2.e -- z2'.e{right} ..tension 3/4 and 1.. {dir 60}z8.e -- z7.e;
+
+ penlabels(2,2',3,4,5,6,7,8);
+endchar;
+
+beginsymbol(8u# + line_thickness# + 2side_bearing#, cap_height#, 0); "daleth";
+ thick := line_thickness;
+
+ x0 = side_bearing;
+ x1 = w - side_bearing;
+ y0r = y1r = h;
+ x3r = x2r = 4/5[x0,x1];
+ y2 = y0;
+ y3 = 0;
+
+ penpos0(3/2thick, 75);
+ penpos1(3/2thick, 75);
+ penpos2(5/4thick, 0);
+ penpos3(5/4thick, 0);
+
+ fill stroke z0.e -- z1.e;
+ fill stroke z2.e -- z3.e;
+
+ penlabels(0,1,2,3);
+endchar;
+
+begingroup;
+save slant;
+save currenttransform;
+slant := 0.212557;
+transform currenttransform;
+currenttransform := identity slanted slant yscaled aspect_ratio scaled granularity shifted (-u,0);
+
+beginsymbol(9u# + 2line_thickness#, x_height#, desc_depth#); "Weierstrass p";
+ numeric theta;
+ theta = 90 - angle(8u,h);
+ slope := -h/8u; % angle at middle
+ superness := 1/sqrt 2;
+ superpull := 1/6;
+
+ penpos2(line_thickness, -60);
+ penpos1(4/3line_thickness, theta);
+ penpos7(line_thickness, -90);
+
+ x2 + 1/2u = x1 = x7 - 1/2u = 3u;
+ y2l = h;
+ y7r = -d;
+ y1 = 2/5[-d, h];
+ x3l = 1/2u;
+ x6r = max(x7 + line_thickness, 1/2w - 1/4u);
+ x3r - x3l = x6r - x6l = 5/4line_thickness;
+
+ ellipse_set(2l,3l,4l,1l);
+ ellipse_set(2r,3r,4r,1r);
+ ellipse_set(7l,6l,5l,1l);
+ ellipse_set(7r,6r,5r,1r);
+
+ y3 = y3r;
+ y6 = y6r;
+
+ fill stroke super_arc.e(2,3) & z3e{down} .. z4e .. z5e .. z6e{down} & super_arc.e(6,7); % flourish
+
+ penpos8(line_thickness, 180);
+ penpos9(line_thickness, 90);
+ penpos10(3/2line_thickness, 0);
+ penpos11(line_thickness, -90);
+ penpos12(line_thickness, -100);
+
+ x10r = w - 3/2u + 1/2line_thickness;
+ x8r = u;
+ x9 = x11 = 1/2w + 3/2u;
+ x12l = max(x6r, .5w + .5u);
+ y8 = y11r = 0;
+ y9r = 19/20h;
+ y10 = 1/2[y9,y11];
+ y12r = 1/4[y11r,y1l];
+
+ fill stroke z7e{left} ... z8e{up} ... pulled_arc.e(9,10) & pulled_arc.e(10,11) .. z12.e; % stem and bowl
+
+ penlabels(1,2,3,4,5,6,7,8,9,10,11,12);
+endchar;
+endgroup;
diff --git a/fonts/fdsymbol/source/fdoperators.mf b/fonts/fdsymbol/source/fdoperators.mf
new file mode 100644
index 0000000000..ef0a22a7cc
--- /dev/null
+++ b/fonts/fdsymbol/source/fdoperators.mf
@@ -0,0 +1,457 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+for scale = 1, 1.4:
+ beginsquarebigop(scale, scale); "big plus";
+ draw_line(centre + op_height/2 * right, centre + op_height/2 * left, false);
+ draw_line(centre + op_height/2 * up, centre + op_height/2 * down, false);
+ endchar;
+endfor;
+charlist current_char - 1: current_char;
+
+for scale = 1, 1.4:
+ beginsquarebigop(scale, scale); "big times";
+ z1 - z0 = z3 - z2 = (op_width - line_thickness / sqrt(2)) * right;
+ z2 - z0 = (op_width - line_thickness / sqrt(2)) * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z0, z3, false);
+ draw_line(z1, z2, false);
+ endchar;
+endfor;
+charlist current_char - 1: current_char;
+
+for sign = 1, -1:
+ for scale = 1, 1.4:
+ beginbigop(scale, scale); "big wedge";
+ draw_less(a, centre + sign * op_height/2 * up, centre - sign * op_height/2 * up, op_width - line_thickness, line_thickness, false);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 1, 1.4:
+ beginbigop(scale, scale); "big wedge dot";
+ draw_less(a, centre + sign * op_height/2 * up, centre - sign * op_height/2 * up, op_width - line_thickness, line_thickness, false);
+ fill dot(centre - sign * 1/4op_height * up, dot_size);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 1, 1.4:
+ beginbigop(4/3scale, scale); "double big wedge";
+ z0 = centre - 1/8op_width * right;
+ z1 = centre + 1/8op_width * right;
+
+ draw_less(a, z0 + sign * op_height/2 * up, z0 - sign * op_height/2 * up, 3/4op_width - line_thickness, line_thickness, false);
+ draw_less(b, z1 + sign * op_height/2 * up, z1 - sign * op_height/2 * up, 3/4op_width - line_thickness, line_thickness, false);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 1, 1.4:
+ beginbigop(scale, scale); "big curly wedge";
+ draw_prec(a, centre + sign * op_height/2 * up, centre - sign * op_height/2 * up, op_width - line_thickness, line_thickness, false);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 1, 1.4:
+ beginbigop(scale, scale); "big union";
+ draw_subset(a, centre + sign * op_height/2 * up, centre - sign * op_height/2 * up, op_width - line_thickness, line_thickness);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 1, 1.4:
+ beginbigop(scale, scale); "big union dot";
+ draw_subset(a, centre + sign * op_height/2 * up, centre - sign * op_height/2 * up, op_width - line_thickness, line_thickness);
+ fill dot(centre - sign * 1/8op_height * up, dot_size);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 1, 1.4:
+ beginbigop(scale, scale); "big union plus";
+ draw_subset(a, centre + sign * op_height/2 * up, centre - sign * op_height/2 * up, op_width - line_thickness, line_thickness);
+
+ r := 1/4op_width;
+
+ draw_line(centre - sign * 1/8op_width * up + r * right, centre - sign * 1/8op_width * up + r * left, false);
+ draw_line(centre + (r - sign * 1/8op_width) * up, centre + (r + sign * 1/8op_width) * down, false);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 1, 1.4:
+ beginbigop(scale, scale); "big square union";
+ z3 - z0 = z2 - z1 = (op_width - line_thickness) * right;
+ z1 - z0 = sign * (op_height - line_thickness) * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, true);
+ draw_line(z2, z3, true);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 1, 1.4:
+ beginbigop(scale, scale); "big square union dot";
+ z3 - z0 = z2 - z1 = (op_width - line_thickness) * right;
+ z1 - z0 = sign * (op_height - line_thickness) * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, true);
+ draw_line(z2, z3, true);
+ fill dot(centre - sign * 1/8op_height * up, dot_size);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 1, 1.4:
+ beginbigop(scale, scale); "big square union plus";
+ z3 - z0 = z2 - z1 = (op_width - line_thickness) * right;
+ z1 - z0 = sign * (op_height - line_thickness) * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, true);
+ draw_line(z2, z3, true);
+
+ r := 1/4op_width;
+
+ draw_line(centre - sign * 1/8op_width * up + r * right, centre - sign * 1/8op_width * up + r * left, false);
+ draw_line(centre + (r - sign * 1/8op_width) * up, centre + (r + sign * 1/8op_width) * down, false);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for alpha = 0, 45:
+ for scale = 1, 1.4:
+ beginsquarebigop(scale, scale); "big circle plus";
+ r := (op_height - line_thickness)/2;
+
+ draw_circle(centre, r, line_thickness);
+ draw_line(centre - r * dir alpha, centre + r * dir alpha, false);
+ draw_line(centre - r * dir (alpha + 90), centre + r * dir (alpha + 90), false);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for scale = 1, 1.4:
+ beginsquarebigop(scale, scale); "big circle dot";
+ draw_circle(centre, (op_height - line_thickness)/2, line_thickness);
+ fill dot(centre, dot_size);
+ endchar;
+endfor;
+charlist current_char - 1: current_char;
+
+for scale = 1, 1.4:
+ beginsquarebigop(scale, scale); "big circle asterisk";
+ thick := line_thickness;
+ r := (op_height - line_thickness)/2;
+
+ draw_circle(centre, r, line_thickness);
+
+ penpos a0(4/3thick, 0);
+ penpos a1(4/3thick, 60);
+ penpos a2(4/3thick, 120);
+ penpos a3(4/3thick, 180);
+ penpos a4(4/3thick, 240);
+ penpos a5(4/3thick, 300);
+
+ penpos b0(thick, 0);
+ penpos b1(thick, 60);
+ penpos b2(thick, 120);
+ penpos b3(thick, 180);
+ penpos b4(thick, 240);
+ penpos b5(thick, 300);
+
+ reg_poly_points(a)(6, centre, r, 90);
+
+ z.b0 = z.b1 = z.b2 = z.b3 = z.b4 = z.b5 = centre;
+
+ fill stroke z.a0e -- z.b0e;
+ fill stroke z.a1e -- z.b1e;
+ fill stroke z.a2e -- z.b2e;
+ fill stroke z.a3e -- z.b3e;
+ fill stroke z.a4e -- z.b4e;
+ fill stroke z.a5e -- z.b5e;
+ endchar;
+endfor;
+charlist current_char - 1: current_char;
+
+for sign = 1, -1:
+ for serifs = true, false:
+ for scale = 1, 1.4:
+ beginbigop(5/4scale, scale); "product";
+ draw_product(centre, op_width, op_height, sign, line_thickness * sqrt sqrt scale, serifs);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+ endfor;
+endfor;
+
+for serifs = true, false:
+ for scale = 1, 1.4:
+ beginbigop(scale, scale); "sum";
+ draw_sum(a)(centre, op_width, op_height, line_thickness * sqrt sqrt scale, serifs);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for serifs = true, false:
+ for scale = 1, 1.4:
+ beginbigop(scale, scale); "sum modulo two";
+ draw_sum(a)(centre, op_width, op_height, line_thickness * sqrt sqrt scale, serifs);
+ draw_circle(z12a, sqrt scale * 1/4op_width, line_thickness * sqrt sqrt scale);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for number = 0, 1, 2, 3:
+ for scale = 1, 1.8:
+ beginsymbol(scale * (5number + 4) * u# + (sqrt scale) * 3/4line_thickness# + 2side_bearing#, vcentre(scale * 1.6asc_height#)); "integral";
+ italcorr scale * 3u# - (sqrt scale) * 3/4line_thickness#; % kerning between upper limit and lower limit
+
+ pair centre;
+
+ for i = 0 upto number:
+ centre := (side_bearing + scale * (5i + 7/2) * u, (h - d)/2);
+ draw_integral([i])(scale, centre, line_thickness * sqrt sqrt scale);
+ endfor;
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for scale = 1, 1.8:
+ beginsymbol(scale * 9u# + 4(equal_spread# + dot_size#) + (sqrt scale) * 3/4line_thickness# + 2side_bearing#, vcentre(scale * 1.6asc_height#)); "integral dots";
+ italcorr scale * 3u# - (sqrt scale) * 3/4line_thickness#; % kerning between upper limit and lower limit
+
+ pair centre;
+ centre := (side_bearing + scale * 7/2u, (h - d)/2);
+
+ draw_integral([0])(scale, centre, line_thickness * sqrt sqrt scale);
+
+ centre := (side_bearing + scale * 6u + 4(equal_spread + dot_size), (h - d)/2);
+
+ draw_integral([1])(scale, centre, line_thickness * sqrt sqrt scale);
+
+ z0 = 1/4[z0[0],z0[1]];
+ z1 = 2/4[z0[0],z0[1]];
+ z2 = 3/4[z0[0],z0[1]];
+
+ fill dot(z0, dot_size);
+ fill dot(z1, dot_size);
+ fill dot(z2, dot_size);
+ endchar;
+endfor;
+charlist current_char - 1: current_char;
+
+for sign = 1, -1:
+ for scale = 1, 1.8:
+ beginsymbol(scale * 6u# + if scale > 1: (sqrt scale) * 3/4line_thickness# else: scale * 3u# fi + 2side_bearing#, vcentre(scale * 1.6asc_height#)); "oriented integral";
+ if scale > 1:
+ italcorr scale * 3u# - (sqrt scale) * 3/4line_thickness#; % kerning between upper limit and lower limit
+ fi
+
+ pair centre;
+ centre := (side_bearing + scale * 9/2u, (h - d)/2);
+
+ draw_integral(a)(scale, centre, line_thickness * sqrt sqrt scale);
+
+ thick := line_thickness * sqrt sqrt scale;
+ r := 4u;
+
+ penpos0(thick, 135);
+ penpos1(thick, 90);
+ penpos2(thick, 45);
+
+ z0 = z0a + sign * scale * (-r, -1/4r);
+ z1 = z0a + sign * scale * (0, 1/4r);
+ z2 = z0a + sign * scale * (r, -1/4r);
+
+ if sign > 0:
+ fill stroke z0.e{dir 45} .. {dir 0}z1.e .. {dir -45}z2.e;
+ draw_arrowhead(z2, -40, 2/3scale * arrow_spread, 5/6thick);
+ else:
+ fill stroke z0.e{dir -135} .. {dir 180}z1.e .. {dir 135}z2.e;
+ draw_arrowhead(z0, 40, 2/3scale * arrow_spread, 5/6thick);
+ fi
+
+ penlabels(0,1,2);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for scale = 1, 1.8:
+ beginsymbol(scale * 4u# + if scale > 1: (sqrt scale) * 3/4line_thickness# else: scale * 3u# fi + 2side_bearing#, vcentre(scale * 1.6asc_height#)); "integral with horizontal bar";
+ if scale > 1:
+ italcorr scale * 3u# - (sqrt scale) * 3/4line_thickness#; % kerning between upper limit and lower limit
+ fi
+
+ pair centre;
+ centre := (side_bearing + scale * 7/2u, (h - d)/2);
+
+ draw_integral(a)(scale, centre, line_thickness * sqrt sqrt scale);
+
+ r := scale * 5/2u;
+ thick := line_thickness * sqrt sqrt scale;
+
+ draw_straight(z0a + r * left, z0a + r * right, thick, true);
+ endchar;
+endfor;
+charlist current_char - 1: current_char;
+
+for scale = 1, 1.8:
+ beginsymbol(scale * 4u# + if scale > 1: (sqrt scale) * 3/4line_thickness# else: scale * 3u# fi + 2side_bearing#, vcentre(scale * 1.6asc_height#)); "integral with double horizontal bar";
+ if scale > 1:
+ italcorr scale * 3u# - (sqrt scale) * 3/4line_thickness#; % kerning between upper limit and lower limit
+ fi
+
+ pair centre;
+ centre := (side_bearing + scale * 7/2u, (h - d)/2);
+
+ draw_integral(a)(scale, centre, line_thickness * sqrt sqrt scale);
+
+ z1 - z0 = equal_spread * up;
+ 1/2[z0, z1] = z0a;
+
+ r := scale * 5/2u;
+ thick := line_thickness * sqrt sqrt scale;
+
+ draw_straight(z0 + r * left, z0 + r * right, thick, true);
+ draw_straight(z1 + r * left, z1 + r * right, thick, true);
+ endchar;
+endfor;
+charlist current_char - 1: current_char;
+
+for scale = 1, 1.8:
+ beginsymbol(scale * 4u# + (sqrt scale) * 3/4line_thickness# + 2side_bearing#, vcentre(scale * 1.6asc_height#)); "stroked integral";
+ italcorr scale * 3u# - (sqrt scale) * 3/4line_thickness#; % kerning between upper limit and lower limit
+
+ pair centre;
+ centre := (side_bearing + scale * 7/2u, (h - d)/2);
+
+ draw_integral(a)(scale, centre, line_thickness * sqrt sqrt scale);
+
+ r := scale * 7/2u;
+ thick := line_thickness * sqrt sqrt scale;
+
+ draw_straight(z0a - r * dir 35, z0a + r * dir 35, thick, true);
+ endchar;
+endfor;
+charlist current_char - 1: current_char;
+
+for number = 0, 1, 2:
+ for scale = 1, 1.8:
+ beginsymbol(scale * (5number + 5) * u# + if scale > 1: (sqrt scale) * 3/4line_thickness# else: scale * 3u# fi + 2side_bearing#, vcentre(scale * 1.6asc_height#)); "contour integral";
+ if scale > 1:
+ italcorr scale * 3u# - (sqrt scale) * 3/4line_thickness#; % kerning between upper limit and lower limit
+ fi
+
+ pair centre;
+
+ centre := (side_bearing + scale * (5number/2 + 4) * u, (h - d)/2);
+ thick := line_thickness * sqrt sqrt scale;
+ r := scale * 4u;
+ s := scale * (5number + 8)/2 * u;
+
+ if number = 0:
+ fill circle(centre, r);
+ unfill circle(centre, r - thick);
+ else:
+ fill superellipse(centre + s * dir 0, centre + r * dir 90, centre - s * dir 0, centre - r * dir 90, 3/4);
+ unfill superellipse(centre + (s - thick) * dir 0, centre + (r - thick) * dir 90, centre - (s - thick) * dir 0, centre - (r - thick) * dir 90, 3/4);
+ fi
+
+ % Integral must come after unfill when processed with MetaPost!
+ for i = 0 upto number:
+ centre := (side_bearing + scale * (5i + 4) * u, (h - d)/2);
+ draw_integral([i])(scale, centre, line_thickness * sqrt sqrt scale);
+ endfor;
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
+
+for alpha = 0, 180:
+ for sign = 1, -1:
+ for scale = 1, 1.8:
+ beginsymbol(scale * 6u# + if scale > 1: (sqrt scale) * 3/4line_thickness# else: scale * 3u# fi + 2side_bearing#, vcentre(scale * 1.6asc_height#)); "oriented contour integral";
+ if scale > 1:
+ italcorr scale * 3u# - (sqrt scale) * 3/4line_thickness#; % kerning between upper limit and lower limit
+ fi
+
+ pair centre;
+ centre := (side_bearing + scale * (4u + if alpha > 90: u else: 0 fi), (h - d)/2);
+
+ draw_integral(a)(scale, centre, line_thickness * sqrt sqrt scale);
+
+ thick := line_thickness * sqrt sqrt scale;
+ r := scale * 4u;
+
+ reg_poly_points(a)(8, z0a, r, alpha + 25);
+ reg_poly_points(b)(8, z0a, r - thick, alpha + 25);
+ z.a8 = z0a + r * dir alpha;
+ z.b8 = z0a + (r - thick) * dir alpha;
+
+ if sign > 0:
+ fill z.a0 .. z.a1 .. z.a2 .. z.a3 .. z.a4 .. z.a5 .. z.a6 .. z.a7 .. z.a8 -- z.b8 .. z.b7 .. z.b6 .. z.b5 .. z.b4 .. z.b3 .. z.b2 .. z.b1 .. z.b0 -- cycle;
+ draw_arrowhead(1/2[z.a8, z.b8], alpha + 75, 2/3scale * arrow_spread, 5/6thick);
+ else:
+ fill z.a8 .. z.a0 .. z.a1 .. z.a2 .. z.a3 .. z.a4 .. z.a5 .. z.a6 .. z.a7 -- z.b7 .. z.b6 .. z.b5 .. z.b4 .. z.b3 .. z.b2 .. z.b1 .. z.b0 .. z.b8 -- cycle;
+ draw_arrowhead(1/2[z.a8, z.b8], alpha - 75, 2/3scale * arrow_spread, 5/6thick);
+ fi
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+ endfor;
+endfor;
+
+for serifs = true, false:
+ for scale = 1, 1.8:
+ beginsymbol(scale * 13/2u# + if scale > 1: 0 else: scale * u# fi + 2side_bearing#, vcentre(scale * 1.6asc_height#)); "sum integral";
+ if scale > 1:
+ italcorr scale * u#; % kerning between upper limit and lower limit
+ fi
+
+ pair centre;
+ centre := (side_bearing + scale * 4u, (h - d)/2);
+
+ draw_integral(a)(scale, centre, line_thickness * sqrt sqrt scale);
+ draw_sum(b, 1/4[z0a.l,z0a.r], scale * 7u, scale * 3/4asc_height, 5/6line_thickness * sqrt sqrt scale, serifs);
+ endchar;
+ endfor;
+ charlist current_char - 1: current_char;
+endfor;
diff --git a/fonts/fdsymbol/source/fdrelations.mf b/fonts/fdsymbol/source/fdrelations.mf
new file mode 100644
index 0000000000..1e339936de
--- /dev/null
+++ b/fonts/fdsymbol/source/fdrelations.mf
@@ -0,0 +1,1151 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+vardef ifneg(text values) =
+ select(negated)(values)
+enddef;
+
+% equal signs
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(1,3) * equal_spread#); "equal";
+ s := 1/2equal_spread;
+
+ draw_line(left_ex + s * up, right_ex + s * up, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+
+ if negated = 1:
+ stroke_through(centre, 3equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(4/2,7/2) * equal_spread#); "equiv";
+ s := equal_spread;
+
+ draw_line(left_ex + s * up, right_ex + s * up, false);
+ draw_line(left_ex, right_ex, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+
+ if negated = 1:
+ stroke_through(centre, 7/2equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(1/2,5/2) * equal_spread#); "sim";
+ draw_sim(a, left_ex, right_ex, 1/4equal_spread, line_thickness);
+
+ if negated = 1:
+ stroke_through(centre, 5/2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(3/2,6/2) * equal_spread#); "approx";
+ s := 1/2equal_spread;
+
+ draw_sim(a, left_ex + s * up, right_ex + s * up, 1/4equal_spread, line_thickness);
+ draw_sim(b, left_ex - s * up, right_ex - s * up, 1/4equal_spread, line_thickness);
+
+ if negated = 1:
+ stroke_through(centre, 3equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(5/2,7/2) * equal_spread#); "triple sim";
+ s := equal_spread;
+
+ draw_sim(a, left_ex + s * up, right_ex + s * up, 1/4equal_spread, line_thickness);
+ draw_sim(b, left_ex, right_ex, 1/4equal_spread, line_thickness);
+ draw_sim(c, left_ex - s * up, right_ex - s * up, 1/4equal_spread, line_thickness);
+
+ if negated = 1:
+ stroke_through(centre, 7/2equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(3/2,6/2) * equal_spread#); "sim equal";
+ s := 1/2equal_spread;
+
+ draw_sim(a, left_ex + s * up, right_ex + s * up, 1/4equal_spread, line_thickness);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+
+ if negated = 1:
+ stroke_through(centre, 3equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(3/2,6/2) * equal_spread#); "equal sim";
+ s := 1/2equal_spread;
+
+ draw_line(left_ex + s * up, right_ex + s * up, false);
+ draw_sim(a, left_ex - s * up, right_ex - s * up, 1/4equal_spread, line_thickness);
+
+ if negated = 1:
+ stroke_through(centre, 3equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(5/2,7/2,6/2) * equal_spread#); "cong";
+ s := equal_spread;
+
+ draw_sim(a, left_ex + s * up, right_ex + s * up, 1/4equal_spread, line_thickness);
+ draw_line(left_ex, right_ex, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+
+ if negated = 1:
+ stroke_through(centre, 7/2equal_spread);
+ elseif negated = 2:
+ if sign = 1:
+ stroke_through(centre - 5/8s * up, 7/4equal_spread);
+ else:
+ stroke_through(centre - 1/2s * up, 2equal_spread);
+ fi;
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(5/2,7/2) * equal_spread#); "approx equal";
+ s := equal_spread;
+
+ draw_sim(a, left_ex + s * up, right_ex + s * up, 1/4equal_spread, line_thickness);
+ draw_sim(b, left_ex, right_ex, 1/4equal_spread, line_thickness);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+
+ if negated = 1:
+ stroke_through(centre, 7/2equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(1,3) * equal_spread# + ifneg(1,0) * 2/5order_width#); "bump equal";
+ s := 1/2equal_spread;
+
+ draw_bump(a, 1, left_ex + s * up, right_ex + s * up, order_width/5, line_thickness);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+
+ if negated = 1:
+ stroke_through(centre, 3equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(4/2,7/2) * equal_spread# + ifneg(1,0) * 2/5order_width#); "bump over equal";
+ s := equal_spread;
+
+ draw_bump(a, 1, left_ex + s * up, right_ex + s * up, order_width/5, line_thickness);
+ draw_line(left_ex, right_ex, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+
+ if negated = 1:
+ stroke_through(centre, 7/2equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(2/2,7/2) * equal_spread# + ifneg(1,0) * 2/5order_width#); "double bump equal";
+ s := 1/2equal_spread;
+
+ draw_bump(a, 1, left_ex + s * up, right_ex + s * up, order_width/5, line_thickness);
+ draw_bump(b, -1, left_ex - s * up, right_ex - s * up, order_width/5, line_thickness);
+
+ if negated = 1:
+ stroke_through(centre, 7/2equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(6/2,7/2) * equal_spread# + ifneg(1,0) * 3/4dot_size#); "dot equal";
+ s := 1/2equal_spread;
+
+ draw_line(left_ex + s * up, right_ex + s * up, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+ fill dot(centre + 3s * up, 3/4dot_size);
+
+ if negated = 1:
+ stroke_through(centre, 7/2equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(6/2,7/2) * equal_spread# + ifneg(1,0) * 3/4dot_size#); "equal dot";
+ s := 1/2equal_spread;
+
+ draw_line(left_ex + s * up, right_ex + s * up, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+ fill dot(centre - 3s * up, 3/4dot_size);
+
+ if negated = 1:
+ stroke_through(centre, 7/2equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(6/2,7/2) * equal_spread# + ifneg(1,0) * 3/4dot_size#); "dot equal dot";
+ s := 1/2equal_spread;
+
+ draw_line(left_ex + s * up, right_ex + s * up, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+ fill dot(centre + 3s * up, 3/4dot_size);
+ fill dot(centre - 3s * up, 3/4dot_size);
+
+ if negated = 1:
+ stroke_through(centre, 7/2equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(6/2,7/2) * equal_spread# + ifneg(1,0) * 3/4dot_size#); "falling dot equal";
+ s := 1/2equal_spread;
+
+ draw_line(left_ex + s * up, right_ex + s * up, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+ fill dot(left_ex + sign * 3/4dot_size * right + 3s * up, 3/4dot_size);
+ fill dot(right_ex - sign * 3/4dot_size * right - 3s * up, 3/4dot_size);
+
+ if negated = 1:
+ stroke_through(centre, 7/2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 1:
+ for sign = 1, -1:
+ beginorder(sign, 4/3order_width# + 3/4dot_size#, equal_spread# + dot_size#); "colon equal";
+ s := 1/2equal_spread;
+ pair left_sep;
+ left_sep := left_ex + sign * (3/4dot_size + 1/3order_width) * right;
+
+ fill dot(left_ex + s * up + sign * 3/4dot_size * right, 3/4dot_size);
+ fill dot(left_ex - s * up + sign * 3/4dot_size * right, 3/4dot_size);
+ draw_line(left_sep + s * up, right_ex + s * up, false);
+ draw_line(left_sep - s * up, right_ex - s * up, false);
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(1, order_width#, ifneg(1/2,5/2) * equal_spread#); "smile";
+ draw_smile(a, sign, left_ex, right_ex, 1/2equal_spread, line_thickness, true);
+
+ if negated = 1:
+ stroke_through(centre, 5/2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(1, order_width#, ifneg(11/6,7/2) * equal_spread#); "smile frown";
+ s := 2/3equal_spread;
+
+ draw_smile(a, sign, left_ex + s * up, right_ex + s * up, 1/2equal_spread, line_thickness, true);
+ draw_smile(b, -sign, left_ex - s * up, right_ex - s * up, 1/2equal_spread, line_thickness, true);
+
+ if negated = 1:
+ stroke_through(centre, 7/2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(1, order_width#, ifneg(5/2,7/2) * equal_spread#); "smile over equal";
+ s := 1equal_spread;
+
+ draw_smile(a, sign, left_ex + s * up, right_ex + s * up, 1/2equal_spread, line_thickness, true);
+ draw_line(left_ex, right_ex, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+
+ if negated = 1:
+ stroke_through(centre, 7/2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(1,3) * equal_spread#); "equal circ";
+ s := 1/2equal_spread;
+
+ draw_line(left_ex + s * up, right_ex + s * up, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+ draw_circle(centre, 5/6s, 3/4line_thickness);
+
+ if negated = 1:
+ stroke_through(centre, 3equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, ifneg(9/2,10/2) * equal_spread#); "circ equal";
+ s := 1/2equal_spread;
+
+ draw_line(left_ex + s * up, right_ex + s * up, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+ draw_circle(centre + 7/2s * up, 5/6s, 3/4line_thickness);
+
+ if negated = 1:
+ stroke_through(centre + s * up, 4equal_spread);
+ fi;
+ endchar;
+fi;
+
+for sign = 1, -1:
+ if negated < 2:
+ beginorder(1, order_width#, 5equal_spread#); "wedge equal";
+ s := 1/2equal_spread;
+
+ draw_line(left_ex + s * up, right_ex + s * up, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+
+ draw_less(a, centre + (7/2 + sign * 3/2) * s * up, centre + (7/2 - sign * 3/2) * s * up, 4s, line_thickness, false);
+
+ if negated = 1:
+ stroke_through(centre + s * up, 4equal_spread);
+ fi;
+ endchar;
+ fi;
+endfor;
+
+if negated < 2:
+ beginorder(1, order_width#, 5equal_spread#); "star equal";
+ s := 1/2equal_spread;
+ r := 5/4s + 3/4line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre + 7/2s * up, r, 90);
+ reg_poly_points(b)(5, centre + 7/2s * up, .4r, 126);
+
+ draw_line(left_ex + s * up, right_ex + s * up, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+ %draw_triangle(a, centre + 7/2s * up, 3/2s, 90, 3/4line_thickness);
+
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+
+ if negated = 1:
+ stroke_through(centre + s * up, 4equal_spread);
+ fi;
+ endchar;
+fi;
+
+if negated < 2:
+ beginorder(1, order_width#, 5equal_spread#); "triangle equal";
+ s := 1/2equal_spread;
+
+ draw_line(left_ex + s * up, right_ex + s * up, false);
+ draw_line(left_ex - s * up, right_ex - s * up, false);
+ draw_triangle(a, centre + 7/2s * up, 3/2s, 90, 3/4line_thickness);
+
+ if negated = 1:
+ stroke_through(centre + s * up, 4equal_spread);
+ fi;
+ endchar;
+fi;
+
+% element signs
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(0,3/2) * equal_spread# + greater_spread#); "element";
+ draw_subset(a, left_ex, right_ex, greater_spread, line_thickness);
+ draw_line(z4a, 1/2[z0a,z1a], false);
+
+ if negated = 1:
+ stroke_through(centre, 3/2equal_spread + greater_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+% orderings
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(0,1) * equal_spread# + greater_spread#); "less than";
+ draw_less(a, left_ex, right_ex, greater_spread, line_thickness, false);
+
+ if negated = 1:
+ stroke_through(centre, equal_spread + greater_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(2/3,6/3,5/3) * equal_spread# + 3/4greater_spread#); "less than or equal";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (2/3equal_spread + s/2) * up;
+ z0 - left_ex = z1 - right_ex = 1/3equal_spread * up;
+
+ draw_less(a, z0, z1, s, line_thickness, false);
+ draw_line(z2, z3, false);
+
+ if negated = 1:
+ stroke_through(centre, 6/3equal_spread + 3/4greater_spread);
+ elseif negated = 2:
+ stroke_through(1/2[z2,z3], equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(1,2) * equal_spread# + 3/4greater_spread#); "less than or slanted equal";
+ s := 3/4greater_spread;
+ t := 1/2equal_spread;
+
+ draw_less(a, left_ex + t * up, right_ex + t * up, s, line_thickness, false);
+
+ if sign = 1:
+ draw_line(z1a - 2t * up, z4a - 2t * up, false);
+ else:
+ draw_line(z0a - 2t * up, z3a - 2t * up, false);
+ fi;
+
+ if negated = 1:
+ stroke_through(centre, 2equal_spread + s);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(5/3,8/3,8/3) * equal_spread# + 3/4greater_spread#); "less than or double equal";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (2/3equal_spread + s/2) * up;
+ z0 - left_ex = z1 - right_ex = 5/6equal_spread * up;
+ z2 - z4 = z3 - z5 = equal_spread * up;
+
+ draw_less(a, z0, z1, s, line_thickness, false);
+ draw_line(z2, z3, false);
+ draw_line(z4, z5, false);
+
+ if negated = 1:
+ stroke_through(centre, 8/3equal_spread + 3/4greater_spread);
+ elseif negated = 2:
+ stroke_through(1/2[1/2[z2,z3], 1/2[z4,z5]], 2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(2/2,4/2,3/2) * equal_spread# + 3/4greater_spread#); "less sim";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (3/4equal_spread + s/2) * up;
+ z0 - left_ex = z1 - right_ex = 1/2equal_spread * up;
+
+ draw_less(a, z0, z1, s, line_thickness, false);
+ if sign > 0:
+ draw_sim(b, z2, z3, 1/4equal_spread, line_thickness);
+ else:
+ draw_sim(b, z3, z2, 1/4equal_spread, line_thickness);
+ fi
+
+ if negated = 1:
+ stroke_through(centre, 2equal_spread + s);
+ elseif negated = 2:
+ stroke_through(1/2[z2,z3], equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(4/2,5/2,5/2) * equal_spread# + 3/4greater_spread#); "less approx";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (3/4equal_spread + s/2) * up;
+ z0 - left_ex = z1 - right_ex = equal_spread * up;
+ z2 - z4 = z3 - z5 = equal_spread * up;
+
+ draw_less(a, z0, z1, s, line_thickness, false);
+
+ if sign > 0:
+ draw_sim(b, z2, z3, 1/4equal_spread, line_thickness);
+ draw_sim(c, z4, z5, 1/4equal_spread, line_thickness);
+ else:
+ draw_sim(b, z3, z2, 1/4equal_spread, line_thickness);
+ draw_sim(c, z5, z4, 1/4equal_spread, line_thickness);
+ fi
+
+ if negated = 1:
+ stroke_through(centre, 5/2equal_spread + s);
+ elseif negated = 2:
+ stroke_through(1/2[1/2[z2,z3], 1/2[z4,z5]], 2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(1,if sign > 0: 2 else: 3/2 fi) * equal_spread# + 9/8greater_spread#); "less greater";
+ s := 3/4greater_spread;
+ t := 1/2equal_spread + 1/4s;
+
+ draw_less(a, left_ex + t * up, right_ex + t * up, s, line_thickness, false);
+ draw_less(b, right_ex - t * up, left_ex - t * up, s, line_thickness, false);
+
+ if negated = 1:
+ stroke_through(centre, if sign > 0: 2 else: 3/2 fi * equal_spread + 3/2s);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(4/3,11/6 + 1/2sign) * equal_spread# + 3/2greater_spread#); "less equal greater";
+ s := 3/4greater_spread;
+ t := 2/3equal_spread + 1/2s;
+
+ draw_less(a, left_ex + t * up, right_ex + t * up, s, line_thickness, false);
+ draw_less(b, right_ex - t * up, left_ex - t * up, s, line_thickness, false);
+ draw_line(left_ex, right_ex, false);
+
+ if negated = 1:
+ stroke_through(centre, (11/6 + 1/2sign) * equal_spread + 2s);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(7/3,17/6 + 1/2sign, 7/3) * equal_spread# + 3/2greater_spread#); "less double equal greater";
+ s := 3/4greater_spread;
+ t := 7/6equal_spread + 1/2s;
+ u := 1/2equal_spread;
+
+ draw_less(a, left_ex + t * up, right_ex + t * up, s, line_thickness, false);
+ draw_less(b, right_ex - t * up, left_ex - t * up, s, line_thickness, false);
+ draw_line(left_ex + u * up, right_ex + u * up, false);
+ draw_line(left_ex - u * up, right_ex - u * up, false);
+
+ if negated = 1:
+ stroke_through(centre, (17/6 + 1/2sign) * equal_spread + 2s);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(2,5/2 + 1/2sign) * equal_spread# + 9/8greater_spread#); "less slanted equal greater";
+ s := 3/4greater_spread;
+ t := equal_spread + 1/4s;
+
+ draw_less(a, left_ex + t * up, right_ex + t * up, s, line_thickness, false);
+ draw_less(b, right_ex - t * up, left_ex - t * up, s, line_thickness, false);
+
+ if sign = 1:
+ draw_line(1/2[z1a,z4b], 1/2[z4a,z1b], false);
+ else:
+ draw_line(1/2[z0a,z3b], 1/2[z3a,z0b], false);
+ fi;
+
+ if negated = 1:
+ stroke_through(centre, (5/2 + 1/2sign) * equal_spread + 3/2s);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width# + 2equal_spread# + line_thickness#, ifneg(0,1) * equal_spread# + greater_spread#); "less less";
+ s := 2equal_spread;
+
+ draw_less(a, left_ex, right_ex - sign * s * right, greater_spread, line_thickness, false);
+ draw_less(b, left_ex + sign * s * right, right_ex, greater_spread, line_thickness, false);
+
+ if negated = 1:
+ stroke_through(centre, equal_spread + greater_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width# + 4equal_spread# + line_thickness#, ifneg(0,1) * equal_spread# + greater_spread#); "less less less";
+ s := 2equal_spread;
+
+ draw_less(a, left_ex, right_ex - sign * 2s * right, greater_spread, line_thickness, false);
+ draw_less(b, left_ex + sign * s * right, right_ex - sign * s * right, greater_spread, line_thickness, false);
+ draw_less(c, left_ex + sign * 2s * right, right_ex, greater_spread, line_thickness, false);
+
+ if negated = 1:
+ stroke_through_angle(centre, equal_spread + greater_spread, 50);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(0,1) * equal_spread# + greater_spread#); "closed less than";
+ draw_less(a, left_ex, right_ex, greater_spread, line_thickness, true);
+
+ if negated = 1:
+ stroke_through(centre, equal_spread + greater_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(2/3,6/3) * equal_spread# + 3/4greater_spread#); "closed less than or equal";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (2/3equal_spread + s/2) * up;
+ z0 - left_ex = z1 - right_ex = 1/3equal_spread * up;
+
+ draw_less(a, z0, z1, s, line_thickness, true);
+ draw_line(z2, z3, false);
+
+ if negated = 1:
+ stroke_through(centre, 6/3equal_spread + s);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width# * sqrt(5/4), ifneg(0,1) * equal_spread# + greater_spread#); "round less than";
+ thick := line_thickness;
+
+ z0 = left_ex;
+ z1 = z0 + order_width * dir angle(right_ex - left_ex);
+
+ draw_less(a, z0, z1, greater_spread, thick, false);
+
+ theta := angle(z0a - z2a);
+
+ z0a = z4r;
+ z0a.r = z4'.r;
+ z1a = z5r;
+ z1a.r = z5'.r;
+
+ penpos4(thick, theta);
+ penpos4'(thick, theta);
+ penpos5(thick, -theta);
+ penpos5'(thick, -theta);
+
+ fill stroke z4.e -- z4'.e{dir (theta - 90)} .. {dir (-theta - 90)}z5'.e -- z5.e;
+
+ if negated = 1:
+ stroke_through(centre, equal_spread + greater_spread);
+ fi;
+
+ penlabels(4,5);
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width# * sqrt(7/6), ifneg(1,2) * equal_spread# + 3/4greater_spread#); "round less than or slanted equal";
+ thick := line_thickness;
+ s := 3/4greater_spread;
+ t := 1/2equal_spread;
+
+ z0 = left_ex + t * up;
+ z1 = z0 + order_width * dir angle(right_ex - left_ex);
+
+ draw_less(a, z0, z1, s, thick, false);
+
+ theta := angle(z0a - z2a);
+
+ z0a - z4 = 1/2thick * dir theta;
+ z1a - z5 = 1/2thick * dir -theta;
+
+ penpos4(thick, theta);
+ penpos5(thick, -theta);
+
+ fill stroke z4.e{dir (theta - 90)} .. {dir (-theta - 90)}z5.e;
+
+ if sign = 1:
+ draw_line(z1a - 2t * up, z4a - 2t * up, false);
+ else:
+ draw_line(z0a - 2t * up, z3a - 2t * up, false);
+ fi;
+
+ if negated = 1:
+ stroke_through(centre, 2equal_spread + 3/4greater_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(0,3/2) * equal_spread# + greater_spread#); "square subset";
+ s := greater_spread;
+
+ draw_line(left_ex + s/2 * up, right_ex + s/2 * up, false);
+ draw_line(left_ex - s/2 * up, right_ex - s/2 * up, false);
+ draw_line(left_point + s/2 * up, left_point - s/2 * up, false);
+
+ if negated = 1:
+ stroke_through(centre, 3/2equal_spread + s);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(1,5/2,2) * equal_spread# + 3/4greater_spread#); "square subset equal";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (equal_spread + s/2) * up;
+ z0 - left_ex = z0' - left_point = z1 - right_ex = 1/2equal_spread * up;
+
+ draw_line(z0 + s/2 * up, z1 + s/2 * up, false);
+ draw_line(z0 - s/2 * up, z1 - s/2 * up, false);
+ draw_line(z0' + s/2 * up, z0' - s/2 * up, false);
+ draw_line(z2, z3, false);
+
+ if negated = 1:
+ stroke_through(centre, 5/2equal_spread + s);
+ elseif negated = 2:
+ stroke_through(1/2[z2,z3] + 1/2equal_spread * up, 2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(2,3,3) * equal_spread# + 3/4greater_spread#); "square subset double equal";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (equal_spread + s/2) * up;
+ z0 - left_ex = z0' - left_point = z1 - right_ex = equal_spread * up;
+ z2 - z4 = z3 - z5 = equal_spread * up;
+
+ draw_line(z0 + s/2 * up, z1 + s/2 * up, false);
+ draw_line(z0 - s/2 * up, z1 - s/2 * up, false);
+ draw_line(z0' + s/2 * up, z0' - s/2 * up, false);
+ draw_line(z2, z3, false);
+ draw_line(z4, z5, false);
+
+ if negated = 1:
+ stroke_through(centre, 3equal_spread + s);
+ elseif negated = 2:
+ stroke_through(1/2[1/2[z2,z3], 1/2[z4,z5]], 2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(0,3/2) * equal_spread# + greater_spread#); "double square subset";
+ s := greater_spread;
+ t := greater_spread - 3/2equal_spread;
+
+ z0 - left_ex = z0' - left_point = 3/4equal_spread * dir (90 - sign * 90);
+
+ draw_line(left_ex + s/2 * up, right_ex + s/2 * up, false);
+ draw_line(left_ex - s/2 * up, right_ex - s/2 * up, false);
+ draw_line(left_point + s/2 * up, left_point - s/2 * up, false);
+
+ draw_line(z0 + t/2 * up, right_ex + t/2 * up, false);
+ draw_line(z0 - t/2 * up, right_ex - t/2 * up, false);
+ draw_line(z0' + t/2 * up, z0' - t/2 * up, false);
+
+ if negated = 1:
+ stroke_through(centre, 3/2equal_spread + s);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(0,3/2) * equal_spread# + greater_spread#); "subset";
+ draw_subset(a, left_ex, right_ex, greater_spread, line_thickness);
+
+ if negated = 1:
+ stroke_through(centre, 3/2equal_spread + greater_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(1,5/2,2) * equal_spread# + 3/4greater_spread#); "subset or equal";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (equal_spread + s/2) * up;
+ z0 - left_ex = z0' - left_point = z1 - right_ex = 1/2equal_spread * up;
+
+ draw_subset(a, z0, z1, s, line_thickness);
+ draw_line(z2, z3, false);
+
+ if negated = 1:
+ stroke_through(centre, 5/2equal_spread + s);
+ elseif negated = 2:
+ stroke_through(1/2[z2,z3] + 1/2equal_spread * up, 2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(2,3,3) * equal_spread# + 3/4greater_spread#); "subset or double equal";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (equal_spread + s/2) * up;
+ z0 - left_ex = z0' - left_point = z1 - right_ex = equal_spread * up;
+ z2 - z4 = z3 - z5 = equal_spread * up;
+
+ draw_subset(a, z0, z1, s, line_thickness);
+ draw_line(z2, z3, false);
+ draw_line(z4, z5, false);
+
+ if negated = 1:
+ stroke_through(centre, 3equal_spread + s);
+ elseif negated = 2:
+ stroke_through(1/2[1/2[z2,z3], 1/2[z4,z5]], 2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(0,3/2) * equal_spread# + greater_spread#); "double subset";
+ s := greater_spread;
+ t := greater_spread - 3/2equal_spread;
+
+ z0 - left_ex = 3/4equal_spread * dir (90 - sign * 90);
+
+ draw_subset(a, left_ex, right_ex, s, line_thickness);
+ draw_subset(b, z0, right_ex, t, line_thickness);
+
+ if negated = 1:
+ stroke_through(centre, 3/2equal_spread + s);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(0,1) * equal_spread# + greater_spread#); "curly less than";
+ draw_prec(a, left_ex, right_ex, greater_spread, line_thickness, false);
+
+ if negated = 1:
+ stroke_through(centre, equal_spread + greater_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(2/3,6/3,5/3) * equal_spread# + 3/4greater_spread#); "curly less than or equal";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (2/3equal_spread + s/2) * up;
+ z0 - left_ex = z1 - right_ex = 1/3equal_spread * up;
+
+ draw_prec(a, z0, z1, s, line_thickness, false);
+ draw_line(z2, z3, false);
+
+ if negated = 1:
+ stroke_through(centre, 6/3equal_spread + s);
+ elseif negated = 2:
+ stroke_through(1/2[z2,z3], equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(1,2) * equal_spread# + 3/4greater_spread#); "curly less than or curly equal";
+ s := 3/4greater_spread;
+
+ z0 - z2 = equal_spread * up;
+ z1 - z3 = (7/5equal_spread + s/2) * up;
+ z0 - left_ex = z1 - right_ex = 1/2equal_spread * up;
+ z2' - z2 = line_thickness * dir (90 - sign * 90);
+
+ draw_prec(a, z0, z1, s, line_thickness, false);
+
+ if sign > 0:
+ theta := angle (z1a.l - z1a);
+ else:
+ theta := angle (z0a.r - z0a);
+ fi;
+
+ penpos2(line_thickness, 90);
+ penpos2'(line_thickness, 90);
+ penpos3(line_thickness, theta);
+ penpos5(line_thickness, theta);
+
+ path p, q;
+
+ p = z2.l -- z2'.l{dir (90 - sign * 90)} .. {dir (theta - sign * 90)}z3.l;
+ q = z2.r -- z2'.r{dir (90 - sign * 90)} .. {dir (theta - sign * 90)}z3.r;
+
+ z5.r = point 1.8 of q;
+ t := xpart (p intersectiontimes (z5.l -- z5.r));
+
+ fill (subpath (0,t) of p) -- (reverse (subpath (0,1.8) of q)) -- cycle;
+
+ penlabels(2,5);
+
+ if negated = 1:
+ stroke_through(centre, 2equal_spread + s);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(5/3,8/3,8/3) * equal_spread# + 3/4greater_spread#); "curly less than or double equal";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (2/3equal_spread + s/2) * up;
+ z0 - left_ex = z1 - right_ex = 5/6equal_spread * up;
+ z2 - z4 = z3 - z5 = equal_spread * up;
+
+ draw_prec(a, z0, z1, s, line_thickness, false);
+ draw_line(z2, z3, false);
+ draw_line(z4, z5, false);
+
+ if negated = 1:
+ stroke_through(centre, 8/3equal_spread + 3/4greater_spread);
+ elseif negated = 2:
+ stroke_through(1/2[1/2[z2,z3], 1/2[z4,z5]], 2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(1,4/2,3/2) * equal_spread# + 3/4greater_spread#); "curly less sim";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (3/4equal_spread + s/2) * up;
+ z0 - left_ex = z1 - right_ex = 1/2equal_spread * up;
+
+ draw_prec(a, z0, z1, s, line_thickness, false);
+ if sign > 0:
+ draw_sim(b, z2, z3, 1/4equal_spread, line_thickness);
+ else:
+ draw_sim(b, z3, z2, 1/4equal_spread, line_thickness);
+ fi
+
+ if negated = 1:
+ stroke_through(centre, 4/2equal_spread + s);
+ elseif negated = 2:
+ stroke_through(1/2[z2,z3], equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 3:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(2,5/2,5/2) * equal_spread# + 3/4greater_spread#); "curly less approx";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (3/4equal_spread + s/2) * up;
+ z0 - left_ex = z1 - right_ex = equal_spread * up;
+ z2 - z4 = z3 - z5 = equal_spread * up;
+
+ draw_prec(a, z0, z1, s, line_thickness, false);
+
+ if sign > 0:
+ draw_sim(b, z2, z3, 1/4equal_spread, line_thickness);
+ draw_sim(c, z4, z5, 1/4equal_spread, line_thickness);
+ else:
+ draw_sim(b, z3, z2, 1/4equal_spread, line_thickness);
+ draw_sim(c, z5, z4, 1/4equal_spread, line_thickness);
+ fi
+
+ if negated = 1:
+ stroke_through(centre, 5/2equal_spread + s);
+ elseif negated = 2:
+ stroke_through(1/2[1/2[z2,z3], 1/2[z4,z5]], 2equal_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(0,1) * equal_spread# + greater_spread#); "less than dot";
+ draw_less(a, left_ex, right_ex, greater_spread, line_thickness, false);
+ fill dot(right_ex - sign * 3/4dot_size * right, 3/4dot_size);
+
+ if negated = 1:
+ stroke_through(centre, equal_spread + greater_spread);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(2/3,6/3) * equal_spread# + 3/4greater_spread#); "less than or equal dot";
+ s := 3/4greater_spread;
+
+ z0 - z2 = z1 - z3 = (2/3equal_spread + s/2) * up;
+ z0 - left_ex = z1 - right_ex = 1/3equal_spread * up;
+
+ draw_less(a, z0, z1, s, line_thickness, false);
+ fill dot(z1 - sign * 3/4dot_size * right, 3/4dot_size);
+ draw_line(z2, z3, false);
+
+ if negated = 1:
+ stroke_through(centre, 6/3equal_spread + s);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(1,2) * equal_spread# + 3/4greater_spread#); "less than or slanted equal dot";
+ s := 3/4greater_spread;
+ t := 1/2equal_spread;
+
+ draw_less(a, left_ex + t * up, right_ex + t * up, s, line_thickness, false);
+ fill dot(right_ex + t * up - sign * 3/4dot_size * right, 3/4dot_size);
+
+ if sign = 1:
+ draw_line(z1a - 2t * up, z4a - 2t * up, false);
+ else:
+ draw_line(z0a - 2t * up, z3a - 2t * up, false);
+ fi;
+
+ if negated = 1:
+ stroke_through(centre, 2equal_spread + s);
+ fi;
+ endchar;
+ endfor;
+fi;
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(1,2) * equal_spread# + 3/4greater_spread#); "slanted equal or less than";
+ s := 3/4greater_spread;
+ t := 1/2equal_spread;
+
+ draw_less(a, left_ex - t * up, right_ex - t * up, s, line_thickness, false);
+
+ if sign = 1:
+ draw_line(z0a + 2t * up, z3a + 2t * up, false);
+ else:
+ draw_line(z1a + 2t * up, z4a + 2t * up, false);
+ fi;
+
+ if negated = 1:
+ stroke_through(centre, 2equal_spread + s);
+ fi;
+ endchar;
+ endfor;
+fi
+
+if negated < 2:
+ for sign = 1, -1:
+ beginorder(sign, order_width#, ifneg(1,2) * equal_spread# + 3/4greater_spread#); "curly equal or curly less than";
+ s := 3/4greater_spread;
+
+ z0 - z2 = -equal_spread * up;
+ z1 - z3 = -(7/5equal_spread + s/2) * up;
+ z0 - left_ex = z1 - right_ex = -1/2equal_spread * up;
+ z2' - z2 = line_thickness * dir (90 - sign * 90);
+
+ draw_prec(a, z0, z1, s, line_thickness, false);
+
+ if sign > 0:
+ theta := angle (z1a.l - z1a);
+ else:
+ theta := angle (z0a.r - z0a);
+ fi;
+
+ penpos2(line_thickness, -90);
+ penpos2'(line_thickness, -90);
+ penpos3(line_thickness, -theta);
+ penpos5(line_thickness, -theta);
+
+ path p, q;
+
+ p = z2.l -- z2'.l{dir (90 - sign * 90)} .. {dir (sign * 90 - theta)}z3.l;
+ q = z2.r -- z2'.r{dir (90 - sign * 90)} .. {dir (sign * 90 - theta)}z3.r;
+
+ z5.r = point 1.8 of q;
+ t := xpart (p intersectiontimes (z5.l -- z5.r));
+
+ fill (subpath (0,t) of p) -- (reverse (subpath (0,1.8) of q)) -- cycle;
+
+ penlabels(2,5);
+
+ if negated = 1:
+ stroke_through(centre, 2equal_spread + s);
+ fi;
+ endchar;
+ endfor;
+fi
diff --git a/fonts/fdsymbol/source/fdturnstile.mf b/fonts/fdsymbol/source/fdturnstile.mf
new file mode 100644
index 0000000000..2ed313bdd6
--- /dev/null
+++ b/fonts/fdsymbol/source/fdturnstile.mf
@@ -0,0 +1,102 @@
+%
+% Copyright (c) 2012, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+for factor = 1, 7/10:
+ for alpha = 0, 90, 180, 270:
+ beginturnstile(alpha, factor); "turnstile (" & decimal alpha & ")";
+ draw_line(foot, foot + (len - line_thickness/2) * dir alpha, false);
+ draw_line(foot - spread/2 * dir (alpha + 90), foot + spread/2 * dir (alpha + 90), true);
+
+ if negated:
+ stroke_through_arrow(foot + 1/2len * dir alpha, alpha, spread)(75, 75, 110, 110, 75, 75, 110, 110);
+ fi
+ endchar;
+ endfor;
+endfor;
+
+for factor = 1, 7/10:
+ for alpha = 0, 90, 180, 270:
+ beginturnstile(alpha, factor); "double turnstile (" & decimal alpha & ")";
+ z1 - z0 = equal_spread * dir (alpha + 90);
+ 1/2[z0,z1] = foot;
+
+ draw_line(z0, z0 + (len - line_thickness/2) * dir alpha, false);
+ draw_line(z1, z1 + (len - line_thickness/2) * dir alpha, false);
+ draw_line(foot - spread/2 * dir (alpha + 90), foot + spread/2 * dir (alpha + 90), true);
+
+ if negated:
+ stroke_through_arrow(foot + 1/2len * dir alpha, alpha, spread)(75, 75, 110, 110, 75, 75, 110, 110);
+ fi
+ endchar;
+ endfor;
+endfor;
+
+for factor = 13/10, 1:
+ for alpha = 0, 90, 180, 270:
+ beginturnstile(alpha, factor); "bar with turnstile (" & decimal alpha & ")";
+ z0 = foot + 3/10turnstile_width * dir alpha;
+
+ draw_line(z0, foot + (len - line_thickness/2) * dir alpha, false);
+ draw_line(foot - spread/2 * dir (alpha + 90), foot + spread/2 * dir (alpha + 90), true);
+ draw_line(z0 - spread/2 * dir (alpha + 90), z0 + spread/2 * dir (alpha + 90), true);
+
+ if negated:
+ stroke_through_arrow(z0 + 1/2(len - 3/10turnstile_width) * dir alpha, alpha, spread)(75, 75, 110, 110, 75, 75, 110, 110);
+ fi
+ endchar;
+ endfor;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginturnstile(alpha, 13/10); "bar with double turnstile (" & decimal alpha & ")";
+ z0 = foot + 3/10turnstile_width * dir alpha;
+ z2 - z1 = z4 - z3 = equal_spread * dir (alpha + 90);
+ 1/2[z1,z2] = foot;
+ 1/2[z3,z4] = z0;
+
+ draw_line(z3, z1 + (len - line_thickness/2) * dir alpha, false);
+ draw_line(z4, z2 + (len - line_thickness/2) * dir alpha, false);
+ draw_line(foot - spread/2 * dir (alpha + 90), foot + spread/2 * dir (alpha + 90), true);
+ draw_line(z0 - spread/2 * dir (alpha + 90), z0 + spread/2 * dir (alpha + 90), true);
+
+ if negated:
+ stroke_through_arrow(z0 + 1/2(len - 3/10turnstile_width) * dir alpha, alpha, spread)(75, 75, 110, 110, 75, 75, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 180:
+ beginturnstile(alpha, 13/10); "double bar with turnstile (" & decimal alpha & ")";
+ z0 = foot + 3/10turnstile_width * dir alpha;
+ z1 = z0 + 3/10turnstile_width * dir alpha;
+
+ draw_line(z1, foot + (len - line_thickness/2) * dir alpha, false);
+ draw_line(foot - spread/2 * dir (alpha + 90), foot + spread/2 * dir (alpha + 90), true);
+ draw_line(z0 - spread/2 * dir (alpha + 90), z0 + spread/2 * dir (alpha + 90), true);
+ draw_line(z1 - spread/2 * dir (alpha + 90), z1 + spread/2 * dir (alpha + 90), true);
+
+ if negated:
+ stroke_through_arrow(z1 + 1/2(len - 3/5turnstile_width) * dir alpha, alpha, spread)(75, 75, 110, 110, 75, 75, 110, 110);
+ fi
+ endchar;
+endfor;
+
+for alpha = 0, 180:
+ beginturnstile(alpha, 1); "triple turnstile (" & decimal alpha & ")";
+ z0 - foot = foot - z1 = equal_spread * dir (alpha + 90);
+
+ draw_line(z0, z0 + (len - line_thickness/2) * dir alpha, false);
+ draw_line(foot, foot + (len - line_thickness/2) * dir alpha, false);
+ draw_line(z1, z1 + (len - line_thickness/2) * dir alpha, false);
+ draw_line(foot - spread/2 * dir (alpha + 90), foot + spread/2 * dir (alpha + 90), true);
+
+ if negated:
+ stroke_through_arrow(foot + 1/2len * dir alpha, alpha, spread)(75, 75, 110, 110, 75, 75, 110, 110);
+ fi
+ endchar;
+endfor;