diff options
Diffstat (limited to 'fonts/fdsymbol/source')
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; |