mirror of
https://gitlab.com/degruyter-public/font/de-gruyter-sans_serif.git
synced 2026-09-20 05:40:46 +09:00
Initial code commit
* inserted scripts * changed README
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
NEW_FONT_NAME = De Gruyter
|
||||
NEW_FONT_NAME_FILES = De-Gruyter
|
||||
|
||||
|
||||
new-font-set: config/chars.csv
|
||||
@echo "Erzeuge neue Fonts aus Char-Config"
|
||||
ruby -e 'require "./lib/font_manager.rb"; FontManager.create_new_fonts(new_font_name: "$(NEW_FONT_NAME)", base_font_regex: /$(NEW_FONT_NAME_FILES)-.*-Manual/)'
|
||||
ruby -e 'require "./lib/font_manager.rb"; FontManager.create_math_font(new_font_name: "$(NEW_FONT_NAME)")'
|
||||
|
||||
|
||||
render-pdf:
|
||||
@mkdir -p pdf-output/fonts/
|
||||
@cp torture-document/*.* pdf-output/
|
||||
@cp output/$(NEW_FONT_NAME_FILES)-*.otf pdf-output/fonts/
|
||||
sed 's/___FONT_PATH___/fonts\//g;s/___REGULAR_SERIF_FONT___/$(NEW_FONT_NAME_FILES)-Serif-Regular.otf/g;s/___BOLD_SERIF_FONT___/$(NEW_FONT_NAME_FILES)-Serif-Bold.otf/g;s/___ITALIC_SERIF_FONT___/$(NEW_FONT_NAME_FILES)-Serif-Italic.otf/g;s/___BOLD_ITALIC_SERIF_FONT___/$(NEW_FONT_NAME_FILES)-Serif-Bold-Italic.otf/g;s/___REGULAR_SANS_FONT___/$(NEW_FONT_NAME_FILES)-Sans-Regular.otf/g;s/___BOLD_SANS_FONT___/$(NEW_FONT_NAME_FILES)-Sans-Bold.otf/g;s/___ITALIC_SANS_FONT___/$(NEW_FONT_NAME_FILES)-Sans-Italic.otf/g;s/___BOLD_ITALIC_SANS_FONT___/$(NEW_FONT_NAME_FILES)-Sans-Bold-Italic.otf/g;' pdf-output/document.tex.template > pdf-output/document.tex
|
||||
cd pdf-output && xelatex document && xelatex document && xelatex document
|
||||
@@ -1,92 +1,37 @@
|
||||
# De Gruyter Font
|
||||
|
||||
|
||||
|
||||
## Getting started
|
||||
|
||||
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
|
||||
|
||||
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
|
||||
|
||||
## Add your files
|
||||
|
||||
- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
|
||||
- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
|
||||
|
||||
```
|
||||
cd existing_repo
|
||||
git remote add origin https://gitlab.com/de-gruyter/font/de-gruyter-sans_serif.git
|
||||
git branch -M main
|
||||
git push -uf origin main
|
||||
```
|
||||
|
||||
## Integrate with your tools
|
||||
|
||||
- [ ] [Set up project integrations](https://gitlab.com/de-gruyter/font/de-gruyter-sans_serif/-/settings/integrations)
|
||||
|
||||
## Collaborate with your team
|
||||
|
||||
- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
|
||||
- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
|
||||
- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
|
||||
- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
|
||||
- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
|
||||
|
||||
## Test and Deploy
|
||||
|
||||
Use the built-in continuous integration in GitLab.
|
||||
|
||||
- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
|
||||
- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
|
||||
- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
|
||||
- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
|
||||
- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
|
||||
|
||||
***
|
||||
|
||||
# Editing this README
|
||||
|
||||
When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template.
|
||||
|
||||
## Suggestions for a good README
|
||||
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
|
||||
|
||||
## Name
|
||||
Choose a self-explaining name for your project.
|
||||
|
||||
## Description
|
||||
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
|
||||
|
||||
## Badges
|
||||
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
|
||||
|
||||
## Visuals
|
||||
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
|
||||
|
||||
## Installation
|
||||
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
|
||||
|
||||
### Requirements
|
||||
|
||||
Required are the essential build tools, ruby, fontforge and texlive
|
||||
|
||||
|
||||
sudo apt install build-essential ruby fontforge texlive-xetex texlive-lang-greek texlive-lang-german texlive-humanities texlive-math-extra
|
||||
|
||||
build-essential -> Make
|
||||
fontforge -> automatic fontediting
|
||||
texlive -> rendering of the example document
|
||||
|
||||
necessary libraries for ruby
|
||||
|
||||
gem install nokogiri
|
||||
gem install pdfkit
|
||||
gem install active_record
|
||||
|
||||
|
||||
## Usage
|
||||
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
|
||||
|
||||
## Support
|
||||
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
|
||||
### Creation of new fonts
|
||||
|
||||
## Roadmap
|
||||
If you have ideas for releases in the future, it is a good idea to list them in the README.
|
||||
1. place source font for glyphs in source_fonts
|
||||
2. in config/chars.csv define the fonts used for the glyph for serif and sans serif versions (regular, bold, italic, bold italic)
|
||||
3. make new-font-set
|
||||
4. the new fonts are placed in output/
|
||||
|
||||
## Contributing
|
||||
State if you are open to contributions and what your requirements are for accepting them.
|
||||
### Creation of test document with the new fonts
|
||||
|
||||
For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
|
||||
1. make render-pdf
|
||||
2. the new document is placed in pdf-output/document.pdf
|
||||
|
||||
You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
|
||||
|
||||
## Authors and acknowledgment
|
||||
Show your appreciation to those who have contributed to the project.
|
||||
|
||||
## License
|
||||
For open source projects, say how it is licensed.
|
||||
|
||||
## Project status
|
||||
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 26.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 4.7 20.66" style="enable-background:new 0 0 4.7 20.66;" xml:space="preserve">
|
||||
<path d="M2.31,20.66c-1.16,0-2.09-0.95-2.09-2.14c0-1.19,0.95-2.14,2.14-2.14c1.16,0,2.11,0.95,2.11,2.14
|
||||
C4.48,19.7,3.5,20.66,2.31,20.66z"/>
|
||||
<path d="M0.88,14.38L0,1.24L4.7,0L3.88,14.38c0,0-0.65-0.15-1.53-0.15S0.88,14.38,0.88,14.38z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 595 B |
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 26.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 9.92 21.26" style="enable-background:new 0 0 9.92 21.26;" xml:space="preserve">
|
||||
<polygon points="6.5,7.1 9.92,0 5.74,0 3.27,8.23 5.47,8.77 3.44,13.87 1.17,11.3 0,21.26 8.93,14.13 4.97,15.22 9.53,7.4 "/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 485 B |
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 26.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 11.29 20.36" style="enable-background:new 0 0 11.29 20.36;" xml:space="preserve">
|
||||
<path d="M8.59,9.38c-1.79,1.15-2.24,2.59-2.26,3.82c0,0.35,0.03,0.71,0.06,1.03c0,0-0.65-0.15-1.58-0.15S3,14.23,3,14.23l-0.15-0.76
|
||||
c-0.09-0.41-0.12-0.79-0.12-1.18c0-1.79,0.91-3.18,2.71-4.47c0.82-0.59,1.94-1.18,1.94-2.38c0-1.44-1.12-2.03-2.41-2.03
|
||||
c-1.41,0-1.71,0.2-2.6,0.91L0,2.55C0.74,1.79,2.67,0,5.7,0c3,0,5.59,1.82,5.59,4.91C11.29,7.62,9.64,8.7,8.59,9.38z"/>
|
||||
<path d="M4.77,20.36c-1.16,0-2.09-0.95-2.09-2.14c0-1.19,0.95-2.14,2.14-2.14c1.16,0,2.11,0.95,2.11,2.14
|
||||
C6.94,19.41,5.96,20.36,4.77,20.36z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 868 B |
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 26.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 9.39 21.26" style="enable-background:new 0 0 9.39 21.26;" xml:space="preserve">
|
||||
<polygon points="6.1,19.26 6.1,9.36 8.23,9.36 8.79,7.36 3.11,7.36 0.61,7.36 1.18,9.36 3.1,9.36 3.1,19.26 0.57,19.26 0,21.26
|
||||
9.39,21.26 8.82,19.26 "/>
|
||||
<circle cx="4.69" cy="2.13" r="2.13"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 553 B |
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 26.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 11.44 21.27" style="enable-background:new 0 0 11.44 21.27;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M10.97,21.27H2.68c-0.13,0-0.24-0.11-0.24-0.24s0.11-0.24,0.24-0.24h8.29c0.13,0,0.24,0.11,0.24,0.24
|
||||
S11.1,21.27,10.97,21.27z"/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon points="0.41,21.26 0,21.26 1.1,14.44 4.81,15.81 "/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon points="4.96,15.27 1.25,13.91 4.82,2.92 10.08,4.81 "/>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M10.35,4.28l-5.25-1.9l0.7-2.27c0,0,2.02-0.33,3.28,0.15s2.34,1.82,2.34,1.82L10.35,4.28z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 791 B |
Binary file not shown.
@@ -0,0 +1,280 @@
|
||||
SplineFontDB: 3.2
|
||||
FontName: De-Gruyter-Icons
|
||||
FullName: De-Gruyter Icons
|
||||
FamilyName: De Gruyter Icons
|
||||
Weight: Regular
|
||||
Copyright: Icon "i" based on Noto SemiCondensed (Noto: Copyright 2015 Google Inc. All Rights Reserved.)
|
||||
Version: 001.000
|
||||
ItalicAngle: 0
|
||||
UnderlinePosition: -100
|
||||
UnderlineWidth: 50
|
||||
Ascent: 800
|
||||
Descent: 200
|
||||
InvalidEm: 0
|
||||
sfntRevision: 0x00010000
|
||||
LayerCount: 2
|
||||
Layer: 0 0 "Hinten" 1
|
||||
Layer: 1 0 "Vorne" 0
|
||||
XUID: [1021 672 1102542148 99988]
|
||||
StyleMap: 0x0000
|
||||
FSType: 0
|
||||
OS2Version: 4
|
||||
OS2_WeightWidthSlopeOnly: 0
|
||||
OS2_UseTypoMetrics: 1
|
||||
CreationTime: 1656670267
|
||||
ModificationTime: 1658228564
|
||||
PfmFamily: 17
|
||||
TTFWeight: 400
|
||||
TTFWidth: 5
|
||||
LineGap: 90
|
||||
VLineGap: 0
|
||||
Panose: 2 0 5 9 0 0 0 0 0 0
|
||||
OS2TypoAscent: 800
|
||||
OS2TypoAOffset: 0
|
||||
OS2TypoDescent: -200
|
||||
OS2TypoDOffset: 0
|
||||
OS2TypoLinegap: 90
|
||||
OS2WinAscent: 810
|
||||
OS2WinAOffset: 0
|
||||
OS2WinDescent: 814
|
||||
OS2WinDOffset: 0
|
||||
HheadAscent: 810
|
||||
HheadAOffset: 0
|
||||
HheadDescent: -814
|
||||
HheadDOffset: 0
|
||||
OS2SubXSize: 650
|
||||
OS2SubYSize: 700
|
||||
OS2SubXOff: 0
|
||||
OS2SubYOff: 140
|
||||
OS2SupXSize: 650
|
||||
OS2SupYSize: 700
|
||||
OS2SupXOff: 0
|
||||
OS2SupYOff: 480
|
||||
OS2StrikeYSize: 49
|
||||
OS2StrikeYPos: 258
|
||||
OS2Vendor: 'PfEd'
|
||||
OS2CodePages: 00000001.00000000
|
||||
OS2UnicodeRanges: 00000001.00000000.00000000.00000000
|
||||
MarkAttachClasses: 1
|
||||
DEI: 91125
|
||||
LangName: 1033 "" "" "" "1.00;DEGRI;De-Gruyter-Icons" "" "" "" "" "" "" "" "" "" "This Font Software is licensed under the SIL Open Font License, Version 1.1. This Font Software is distributed on an +ACIA-AS IS+ACIA BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software." "http://scripts.sil.org/OFL" "" "De Gruyter Icons" "Icons"
|
||||
Encoding: UnicodeBmp
|
||||
UnicodeInterp: none
|
||||
NameList: AGL For New Fonts
|
||||
DisplaySize: -48
|
||||
AntiAlias: 1
|
||||
FitToEm: 0
|
||||
WinInfo: 33 33 13
|
||||
BeginPrivate: 3
|
||||
BlueShift 1 0
|
||||
StdVW 6 [1634]
|
||||
StemSnapV 6 [1634]
|
||||
EndPrivate
|
||||
TeXData: 1 0 0 346030 173015 115343 0 1048576 115343 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144
|
||||
BeginChars: 65537 6
|
||||
|
||||
StartChar: .notdef
|
||||
Encoding: 65536 -1 0
|
||||
Width: 1632
|
||||
Flags: MW
|
||||
HStem: 0 50<100 1532 100 1582> 483 50<100 1532 100 100>
|
||||
VStem: 50 50<50 50 50 483> 1532 50<50 483 483 483>
|
||||
LayerCount: 2
|
||||
Fore
|
||||
SplineSet
|
||||
50 0 m 1
|
||||
50 533 l 1
|
||||
1582 533 l 1
|
||||
1582 0 l 1
|
||||
50 0 l 1
|
||||
100 50 m 1
|
||||
1532 50 l 1
|
||||
1532 483 l 1
|
||||
100 483 l 1
|
||||
100 50 l 1
|
||||
EndSplineSet
|
||||
Validated: 1
|
||||
EndChar
|
||||
|
||||
StartChar: one
|
||||
Encoding: 49 49 1
|
||||
Width: 1632
|
||||
Flags: HMW
|
||||
VStem: 0 1634<-802 798 798 798>
|
||||
LayerCount: 2
|
||||
Back
|
||||
SplineSet
|
||||
0 798 m 5
|
||||
1634 810 l 5
|
||||
1637.84375 257.29296875 1635.19628906 -269.451171875 1634 -802 c 5
|
||||
0 -814 l 5
|
||||
0 798 l 5
|
||||
EndSplineSet
|
||||
Fore
|
||||
SplineSet
|
||||
808.828125 349.120117188 m 4xf0
|
||||
840.680664062 349.120117188 868.80078125 357.58203125 893.186523438 374.502929688 c 4
|
||||
917.57421875 391.424804688 929.76953125 417.803710938 929.76953125 453.637695312 c 4
|
||||
929.76953125 490.467773438 917.57421875 517.094726562 893.186523438 533.518554688 c 4
|
||||
868.80078125 549.944335938 840.680664062 558.155273438 808.828125 558.155273438 c 4
|
||||
774.984375 558.155273438 746.61328125 549.944335938 723.719726562 533.518554688 c 4
|
||||
700.826171875 517.094726562 689.377929688 490.467773438 689.377929688 453.637695312 c 4
|
||||
689.377929688 417.803710938 700.826171875 391.424804688 723.719726562 374.502929688 c 4
|
||||
746.61328125 357.58203125 774.984375 349.120117188 808.828125 349.120117188 c 4xf0
|
||||
593.819335938 -588.555664062 m 5
|
||||
1037.2734375 -588.555664062 l 5
|
||||
1037.2734375 -510.9140625 l 5
|
||||
1020.85058594 -510.9140625 l 6
|
||||
1005.91894531 -510.9140625 990.73828125 -508.673828125 975.310546875 -504.196289062 c 4
|
||||
959.880859375 -499.71484375 947.188476562 -490.009765625 937.235351562 -475.080078125 c 4
|
||||
927.28125 -460.1484375 922.3046875 -438.747070312 922.3046875 -410.875976562 c 6xe8
|
||||
922.3046875 211.75390625 l 5
|
||||
592.326171875 211.75390625 l 5
|
||||
592.326171875 134.111328125 l 5
|
||||
611.736328125 134.111328125 l 6
|
||||
633.634765625 134.111328125 655.286132812 128.387695312 676.686523438 116.940429688 c 4
|
||||
698.087890625 105.493164062 708.788085938 79.8603515625 708.788085938 40.0439453125 c 6
|
||||
708.788085938 -410.876953125 l 6
|
||||
708.788085938 -453.6796875 698.087890625 -481.051757812 676.686523438 -492.999023438 c 4
|
||||
655.286132812 -504.943359375 632.640625 -510.915039062 608.75 -510.915039062 c 6
|
||||
593.819335938 -510.915039062 l 5
|
||||
593.819335938 -588.555664062 l 5
|
||||
0 798 m 1
|
||||
1634 810 l 1
|
||||
1637.84375 257.29296875 1635.19628906 -269.451171875 1634 -802 c 1
|
||||
0 -814 l 1
|
||||
0 798 l 1
|
||||
EndSplineSet
|
||||
EndChar
|
||||
|
||||
StartChar: two
|
||||
Encoding: 50 50 2
|
||||
Width: 1632
|
||||
Flags: HMW
|
||||
VStem: 0 1634<-802 798 798 798>
|
||||
LayerCount: 2
|
||||
Fore
|
||||
SplineSet
|
||||
1030.13574219 39.505859375 m 4
|
||||
1092.48730469 79.8837890625 1190.46582031 144.014648438 1190.46582031 304.938476562 c 4
|
||||
1190.46582031 488.426757812 1036.66894531 596.5 858.525390625 596.5 c 4
|
||||
678.600585938 596.5 563.994140625 490.208007812 520.052734375 445.079101562 c 5
|
||||
660.78515625 339.973632812 l 6
|
||||
713.635742188 382.133789062 731.450195312 394.010742188 815.176757812 394.010742188 c 4
|
||||
891.778320312 394.010742188 958.28515625 358.974609375 958.28515625 273.466796875 c 4
|
||||
958.28515625 202.208984375 891.778320312 167.173828125 843.0859375 132.139648438 c 4
|
||||
736.200195312 55.5380859375 682.163085938 -27.0009765625 682.163085938 -133.294921875 c 4
|
||||
682.163085938 -156.453125 683.944335938 -179.018554688 689.2890625 -203.364257812 c 6
|
||||
698.196289062 -248.494140625 l 5
|
||||
698.196289062 -248.494140625 750.451171875 -239.5859375 805.67578125 -239.5859375 c 4
|
||||
860.901367188 -239.5859375 899.498046875 -248.494140625 899.498046875 -248.494140625 c 5
|
||||
897.716796875 -229.491210938 895.934570312 -208.114257812 895.934570312 -187.331054688 c 4
|
||||
897.122070312 -114.291992188 923.844726562 -28.783203125 1030.13574219 39.505859375 c 4
|
||||
803.301757812 -612.5 m 4
|
||||
873.963867188 -612.5 932.157226562 -556.087890625 931.564453125 -485.423828125 c 4
|
||||
931.564453125 -414.76171875 875.15234375 -358.349609375 806.26953125 -358.349609375 c 4
|
||||
735.606445312 -358.349609375 679.194335938 -414.76171875 679.194335938 -485.423828125 c 4
|
||||
679.194335938 -556.087890625 734.418945312 -612.5 803.301757812 -612.5 c 4
|
||||
0 798 m 1
|
||||
1634 810 l 1
|
||||
1637.84375 257.29296875 1635.19628906 -269.451171875 1634 -802 c 1
|
||||
0 -814 l 1
|
||||
0 798 l 1
|
||||
EndSplineSet
|
||||
EndChar
|
||||
|
||||
StartChar: three
|
||||
Encoding: 51 51 3
|
||||
Width: 1632
|
||||
Flags: HMW
|
||||
VStem: 0 1634<-802 798 798 798>
|
||||
LayerCount: 2
|
||||
Fore
|
||||
SplineSet
|
||||
813.405273438 -603.5 m 4
|
||||
883.04296875 -603.5 940.390625 -547.321289062 939.806640625 -478.26953125 c 4
|
||||
939.806640625 -408.631835938 884.213867188 -353.038085938 816.33203125 -353.038085938 c 4
|
||||
746.693359375 -353.038085938 691.100585938 -408.631835938 691.100585938 -478.26953125 c 4
|
||||
691.100585938 -547.907226562 745.5234375 -603.5 813.405273438 -603.5 c 4
|
||||
729.723632812 -236.001953125 m 5
|
||||
729.723632812 -236.001953125 764.25 -227.223632812 815.74609375 -227.223632812 c 4
|
||||
867.243164062 -227.223632812 905.280273438 -236.001953125 905.280273438 -236.001953125 c 5
|
||||
953.266601562 605.5 l 5
|
||||
678.2265625 532.936523438 l 5
|
||||
729.723632812 -236.001953125 l 5
|
||||
0 798 m 1
|
||||
1634 810 l 1
|
||||
1637.84375 257.29296875 1635.19628906 -269.451171875 1634 -802 c 1
|
||||
0 -814 l 1
|
||||
0 798 l 1
|
||||
EndSplineSet
|
||||
EndChar
|
||||
|
||||
StartChar: four
|
||||
Encoding: 52 52 4
|
||||
Width: 1632
|
||||
Flags: HMW
|
||||
VStem: 0 1634<-802 798 798 798>
|
||||
LayerCount: 2
|
||||
Fore
|
||||
SplineSet
|
||||
886.65234375 201.577148438 m 5
|
||||
1081.13867188 605.3359375 l 5
|
||||
843.43359375 605.3359375 l 5
|
||||
702.970703125 137.317382812 l 5
|
||||
828.080078125 106.609375 l 5
|
||||
712.639648438 -183.4140625 l 5
|
||||
583.549804688 -37.265625 l 5
|
||||
577.46484375 -613.3359375 l 5
|
||||
1024.84082031 -198.19921875 l 5
|
||||
799.646484375 -260.184570312 l 5
|
||||
1058.9609375 184.517578125 l 5
|
||||
886.65234375 201.577148438 l 5
|
||||
0 798 m 1
|
||||
1634 810 l 1
|
||||
1637.84375 257.29296875 1635.19628906 -269.451171875 1634 -802 c 1
|
||||
0 -814 l 1
|
||||
0 798 l 1
|
||||
EndSplineSet
|
||||
EndChar
|
||||
|
||||
StartChar: five
|
||||
Encoding: 53 53 5
|
||||
Width: 1632
|
||||
Flags: HMWO
|
||||
VStem: 0 1634<-802 798 798 798>
|
||||
LayerCount: 2
|
||||
Fore
|
||||
SplineSet
|
||||
1118.43554688 -596.959960938 m 6
|
||||
1125.82324219 -596.959960938 1132.07617188 -590.70703125 1132.07617188 -583.317382812 c 4
|
||||
1132.07617188 -575.928710938 1125.82324219 -569.67578125 1118.43554688 -569.67578125 c 6
|
||||
647.225585938 -569.67578125 l 6
|
||||
639.8359375 -569.67578125 633.584960938 -575.928710938 633.584960938 -583.317382812 c 4
|
||||
633.584960938 -590.70703125 639.8359375 -596.959960938 647.225585938 -596.959960938 c 6
|
||||
1118.43554688 -596.959960938 l 6
|
||||
518.198242188 -596.391601562 m 5
|
||||
768.295898438 -286.610351562 l 5
|
||||
557.416992188 -208.73828125 l 5
|
||||
494.893554688 -596.391601562 l 5
|
||||
518.198242188 -596.391601562 l 5
|
||||
776.823242188 -255.915039062 m 5
|
||||
1067.84667969 338.637695312 l 5
|
||||
768.865234375 446.06640625 l 5
|
||||
565.944335938 -178.612304688 l 5
|
||||
776.823242188 -255.915039062 l 5
|
||||
1083.19335938 368.762695312 m 5
|
||||
1144.01269531 493.8125 l 5
|
||||
1144.01269531 493.8125 1082.62597656 569.978515625 1011.00683594 597.26171875 c 4
|
||||
939.387695312 624.544921875 824.569335938 605.788085938 824.569335938 605.788085938 c 5
|
||||
784.780273438 476.759765625 l 5
|
||||
1083.19335938 368.762695312 l 5
|
||||
0 798 m 1
|
||||
1634 810 l 1
|
||||
1637.84375 257.29296875 1635.19628906 -269.451171875 1634 -802 c 1
|
||||
0 -814 l 1
|
||||
0 798 l 1
|
||||
EndSplineSet
|
||||
EndChar
|
||||
EndChars
|
||||
EndSplineFont
|
||||
Binary file not shown.
@@ -0,0 +1,52 @@
|
||||
#!/usr/local/bin/fontforge
|
||||
# $1 => Source-Font
|
||||
# $2 => Target-Font
|
||||
# $3 => FullName
|
||||
# $4 => Weight
|
||||
# $5 => Family
|
||||
# $6 => UniqueID
|
||||
# $7 => Version
|
||||
# $8 => Copyright
|
||||
# $9 => Scaling
|
||||
# $10 => Ascent
|
||||
# $11 => Decent
|
||||
|
||||
Print("Open " + $1);
|
||||
Open($1);
|
||||
|
||||
|
||||
SetTTFName(0x409, 0, $8) # Copyright
|
||||
SetTTFName(0x409, 1, $5) # Family
|
||||
SetTTFName(0x409, 2, $4) # Sub Family-Name
|
||||
SetTTFName(0x409, 3, $6) # UniqueID
|
||||
SetTTFName(0x409, 4, $5 + " " + $4) # Fullname
|
||||
SetTTFName(0x409, 5, "Version " + $7) # Version
|
||||
SetTTFName(0x409, 16, $5) # Preferred Family
|
||||
SetTTFName(0x409, 17, $4) # Preferred Sub-Family
|
||||
SetFontNames($3, $5, $5 + " " + $4, $4, $8, $7)
|
||||
|
||||
|
||||
ClearPrivateEntry('BlueValues')
|
||||
ClearPrivateEntry('OtherBlues')
|
||||
ClearPrivateEntry('BlueScale')
|
||||
ClearPrivateEntry('BlueShift')
|
||||
ClearPrivateEntry('StdHW')
|
||||
ClearPrivateEntry('StdVW')
|
||||
|
||||
|
||||
|
||||
# Em-Values
|
||||
SelectAll()
|
||||
ScaleToEm(Strtol($10), Strtol($11))
|
||||
|
||||
SelectAll()
|
||||
Transform(Strtol($9), 0, 0, Strtol($9), 0, 0)
|
||||
|
||||
# AUTOHINT
|
||||
SelectAll()
|
||||
AutoHint()
|
||||
|
||||
|
||||
Print("Generate " + $2)
|
||||
Generate($2);
|
||||
Quit(0);
|
||||
@@ -0,0 +1,30 @@
|
||||
#!/usr/local/bin/fontforge
|
||||
#Take a Latin font and apply some simple transformations to it
|
||||
#prior to adding cyrillic letters.
|
||||
#can be run in a non-interactive fontforge session.
|
||||
# $1 => der Quellfont
|
||||
# $2 => der Zielfont-Name
|
||||
# $3 => der Zielfont-Family-Name
|
||||
# $4 => Der Codepoint an dem die kombinierte Glyphe eingesetzt werden soll
|
||||
# $5 => Das Basiszeichen für die kombinierte Glyphe
|
||||
# $6.. => Die Diakritika
|
||||
|
||||
Print("Open " + $1);
|
||||
Open($1);
|
||||
Print("Select " + ToString(UCodePoint(Strtol(Strsub($4,3), 16))));
|
||||
Select(UCodePoint(Strtol(Strsub($4,3), 16)));
|
||||
CopyReference();
|
||||
Print("Select " + $3);
|
||||
Select(UCodePoint(Strtol(Strsub($3,3), 16)));
|
||||
Paste();
|
||||
SetFontNames($2, $3, $2);
|
||||
;
|
||||
i=6
|
||||
while ( i<$argc )
|
||||
AddAccent(UCodePoint(Strtol(Strsub($argv[i],3), 16)));
|
||||
i = i+1
|
||||
endloop
|
||||
Print("Generate " + $2 + '.otf')
|
||||
Generate($2 + '.otf');
|
||||
Quit(0);
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
import fontforge
|
||||
import sys
|
||||
|
||||
source_font = fontforge.open(sys.argv[1])
|
||||
|
||||
target_font = fontforge.open(sys.argv[2])
|
||||
|
||||
target_font.familyname = sys.argv[3]
|
||||
target_font.fontname = sys.argv[3]
|
||||
target_font.fullname = sys.argv[3]
|
||||
|
||||
target_glyph = int(sys.argv[4].strip().replace("uni",""),16)
|
||||
base_source_glyph = int(sys.argv[5].strip().replace("uni",""),16)
|
||||
|
||||
|
||||
target_font.selection.select(("more",None),target_glyph)
|
||||
|
||||
|
||||
source_font.selection.select(("more",None),base_source_glyph)
|
||||
source_font.copy()
|
||||
target_font.paste()
|
||||
|
||||
for i in sys.argv[6:]:
|
||||
source_font.selection.select(int(i.strip().replace("uni",""),16))
|
||||
source_font.copy()
|
||||
target_font.pasteInto()
|
||||
|
||||
target_font.generate(sys.argv[3] + ".otf")
|
||||
@@ -0,0 +1,27 @@
|
||||
import fontforge
|
||||
import sys
|
||||
|
||||
with open(sys.argv[1]) as f:
|
||||
content = f.readlines()
|
||||
# you may also want to remove whitespace characters like `\n` at the end of each line
|
||||
content = [int(x.strip().replace("uni",""),16) for x in content]
|
||||
|
||||
|
||||
source_font = fontforge.open(sys.argv[2])
|
||||
[source_font.selection.select(("more",None),x) for x in content]
|
||||
if content:
|
||||
print("Copy")
|
||||
source_font.copy()
|
||||
print("Copy")
|
||||
|
||||
target_font = fontforge.open(sys.argv[3])
|
||||
[target_font.selection.select(("more",None),x) for x in content]
|
||||
if content:
|
||||
print("Paste")
|
||||
target_font.paste()
|
||||
print("Paste")
|
||||
|
||||
target_font.familyname = sys.argv[5]
|
||||
target_font.fontname = sys.argv[4]
|
||||
target_font.fullname = sys.argv[4]
|
||||
target_font.generate(sys.argv[4] + ".otf")
|
||||
@@ -0,0 +1,427 @@
|
||||
#!/usr/local/bin/fontforge
|
||||
#
|
||||
# Soll in einem Font die Namen der verschiedenen Glyphen für Zahlen setzen und die entsprechenden Subtables anpassen
|
||||
# $1 => der Quellfont
|
||||
|
||||
Print("Open " + $1);
|
||||
Open($1 + '.otf');
|
||||
|
||||
|
||||
|
||||
lookups = GetLookups("GSUB")
|
||||
i=0; #semicolon is not needed here, but it's ok
|
||||
while ( i<SizeOf(lookups) )
|
||||
if ( Strsub(lookups[i], 1, 5) == 'lnum')
|
||||
@lnum_lu = lookups[i]
|
||||
elseif ( Strsub(lookups[i], 1, 5) == 'pnum')
|
||||
@pnum_lu = lookups[i]
|
||||
elseif ( Strsub(lookups[i], 1, 5) == 'tnum')
|
||||
@tnum_lu = lookups[i]
|
||||
elseif ( Strsub(lookups[i], 1, 5) == 'onum')
|
||||
@onum_lu = lookups[i]
|
||||
elseif ( Strsub(lookups[i], 1, 5) == 'numr')
|
||||
@numr_lu = lookups[i]
|
||||
elseif ( Strsub(lookups[i], 1, 5) == 'dnom')
|
||||
@dnom_lu = lookups[i]
|
||||
endif
|
||||
++i
|
||||
endloop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### Die eigentlichen Zahlen sollen proportional sein
|
||||
### Codepoints F130-F139 enthalten die tabular-Varianten
|
||||
|
||||
|
||||
|
||||
Select(UCodePoint(Strtol("F130", 16)));
|
||||
SetGlyphName('zero.tf', 0)
|
||||
Select(UCodePoint(Strtol("F131", 16)));
|
||||
SetGlyphName('one.tf', 0)
|
||||
Select(UCodePoint(Strtol("F132", 16)));
|
||||
SetGlyphName('two.tf', 0)
|
||||
Select(UCodePoint(Strtol("F133", 16)));
|
||||
SetGlyphName('three.tf', 0)
|
||||
Select(UCodePoint(Strtol("F134", 16)));
|
||||
SetGlyphName('four.tf', 0)
|
||||
Select(UCodePoint(Strtol("F135", 16)));
|
||||
SetGlyphName('five.tf', 0)
|
||||
Select(UCodePoint(Strtol("F136", 16)));
|
||||
SetGlyphName('six.tf', 0)
|
||||
Select(UCodePoint(Strtol("F137", 16)));
|
||||
SetGlyphName('seven.tf', 0)
|
||||
Select(UCodePoint(Strtol("F138", 16)));
|
||||
SetGlyphName('eight.tf', 0)
|
||||
Select(UCodePoint(Strtol("F139", 16)));
|
||||
SetGlyphName('nine.tf', 0)
|
||||
|
||||
### Codepoints F230-F239 enthalten die old style-Varianten
|
||||
Select(UCodePoint(Strtol("F230", 16)));
|
||||
SetGlyphName('zero.osf', 0)
|
||||
Select(UCodePoint(Strtol("F231", 16)));
|
||||
SetGlyphName('one.osf', 0)
|
||||
Select(UCodePoint(Strtol("F232", 16)));
|
||||
SetGlyphName('two.osf', 0)
|
||||
Select(UCodePoint(Strtol("F233", 16)));
|
||||
SetGlyphName('three.osf', 0)
|
||||
Select(UCodePoint(Strtol("F234", 16)));
|
||||
SetGlyphName('four.osf', 0)
|
||||
Select(UCodePoint(Strtol("F235", 16)));
|
||||
SetGlyphName('five.osf', 0)
|
||||
Select(UCodePoint(Strtol("F236", 16)));
|
||||
SetGlyphName('six.osf', 0)
|
||||
Select(UCodePoint(Strtol("F237", 16)));
|
||||
SetGlyphName('seven.osf', 0)
|
||||
Select(UCodePoint(Strtol("F238", 16)));
|
||||
SetGlyphName('eight.osf', 0)
|
||||
Select(UCodePoint(Strtol("F239", 16)));
|
||||
SetGlyphName('nine.osf', 0)
|
||||
|
||||
### Codepoints F330-F339 enthalten die tabular old style-Varianten
|
||||
Select(UCodePoint(Strtol("F330", 16)));
|
||||
SetGlyphName('zero.tosf', 0)
|
||||
Select(UCodePoint(Strtol("F331", 16)));
|
||||
SetGlyphName('one.tosf', 0)
|
||||
Select(UCodePoint(Strtol("F332", 16)));
|
||||
SetGlyphName('two.tosf', 0)
|
||||
Select(UCodePoint(Strtol("F333", 16)));
|
||||
SetGlyphName('three.tosf', 0)
|
||||
Select(UCodePoint(Strtol("F334", 16)));
|
||||
SetGlyphName('four.tosf', 0)
|
||||
Select(UCodePoint(Strtol("F335", 16)));
|
||||
SetGlyphName('five.tosf', 0)
|
||||
Select(UCodePoint(Strtol("F336", 16)));
|
||||
SetGlyphName('six.tosf', 0)
|
||||
Select(UCodePoint(Strtol("F337", 16)));
|
||||
SetGlyphName('seven.tosf', 0)
|
||||
Select(UCodePoint(Strtol("F338", 16)));
|
||||
SetGlyphName('eight.tosf', 0)
|
||||
Select(UCodePoint(Strtol("F339", 16)));
|
||||
SetGlyphName('nine.tosf', 0)
|
||||
|
||||
### Codepoints F430-F439 enthalten die numr-Varianten
|
||||
Select(UCodePoint(Strtol("F430", 16)));
|
||||
SetGlyphName('zero.numr', 0)
|
||||
Select(UCodePoint(Strtol("F431", 16)));
|
||||
SetGlyphName('one.numr', 0)
|
||||
Select(UCodePoint(Strtol("F432", 16)));
|
||||
SetGlyphName('two.numr', 0)
|
||||
Select(UCodePoint(Strtol("F433", 16)));
|
||||
SetGlyphName('three.numr', 0)
|
||||
Select(UCodePoint(Strtol("F434", 16)));
|
||||
SetGlyphName('four.numr', 0)
|
||||
Select(UCodePoint(Strtol("F435", 16)));
|
||||
SetGlyphName('five.numr', 0)
|
||||
Select(UCodePoint(Strtol("F436", 16)));
|
||||
SetGlyphName('six.numr', 0)
|
||||
Select(UCodePoint(Strtol("F437", 16)));
|
||||
SetGlyphName('seven.numr', 0)
|
||||
Select(UCodePoint(Strtol("F438", 16)));
|
||||
SetGlyphName('eight.numr', 0)
|
||||
Select(UCodePoint(Strtol("F439", 16)));
|
||||
SetGlyphName('nine.numr', 0)
|
||||
|
||||
### Codepoints F530-F539 enthalten die dnom-Varianten
|
||||
Select(UCodePoint(Strtol("F530", 16)));
|
||||
SetGlyphName('zero.dnom', 0)
|
||||
Select(UCodePoint(Strtol("F531", 16)));
|
||||
SetGlyphName('one.dnom', 0)
|
||||
Select(UCodePoint(Strtol("F532", 16)));
|
||||
SetGlyphName('two.dnom', 0)
|
||||
Select(UCodePoint(Strtol("F533", 16)));
|
||||
SetGlyphName('three.dnom', 0)
|
||||
Select(UCodePoint(Strtol("F534", 16)));
|
||||
SetGlyphName('four.dnom', 0)
|
||||
Select(UCodePoint(Strtol("F535", 16)));
|
||||
SetGlyphName('five.dnom', 0)
|
||||
Select(UCodePoint(Strtol("F536", 16)));
|
||||
SetGlyphName('six.dnom', 0)
|
||||
Select(UCodePoint(Strtol("F537", 16)));
|
||||
SetGlyphName('seven.dnom', 0)
|
||||
Select(UCodePoint(Strtol("F538", 16)));
|
||||
SetGlyphName('eight.dnom', 0)
|
||||
Select(UCodePoint(Strtol("F539", 16)));
|
||||
SetGlyphName('nine.dnom', 0)
|
||||
|
||||
|
||||
############################ LNUM ####################################
|
||||
############################ LNUM ####################################
|
||||
############################ LNUM ####################################
|
||||
|
||||
Print(GetLookupSubtables(@lnum_lu))
|
||||
RemoveLookupSubtable(@lnum_lu + " subtable")
|
||||
AddLookupSubtable(@lnum_lu, @lnum_lu + " subtable")
|
||||
|
||||
Select(UCodePoint(Strtol("F130", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'zero')
|
||||
Select(UCodePoint(Strtol("F131", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'one')
|
||||
Select(UCodePoint(Strtol("F132", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'two')
|
||||
Select(UCodePoint(Strtol("F133", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'three')
|
||||
Select(UCodePoint(Strtol("F134", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'four')
|
||||
Select(UCodePoint(Strtol("F135", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'five')
|
||||
Select(UCodePoint(Strtol("F136", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'six')
|
||||
Select(UCodePoint(Strtol("F137", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'seven')
|
||||
Select(UCodePoint(Strtol("F138", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'eight')
|
||||
Select(UCodePoint(Strtol("F139", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'nine')
|
||||
|
||||
Select(UCodePoint(Strtol("F330", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'zero.osf')
|
||||
Select(UCodePoint(Strtol("F331", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'one.osf')
|
||||
Select(UCodePoint(Strtol("F332", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'two.osf')
|
||||
Select(UCodePoint(Strtol("F333", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'three.osf')
|
||||
Select(UCodePoint(Strtol("F334", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'four.osf')
|
||||
Select(UCodePoint(Strtol("F335", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'five.osf')
|
||||
Select(UCodePoint(Strtol("F336", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'six.osf')
|
||||
Select(UCodePoint(Strtol("F337", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'seven.osf')
|
||||
Select(UCodePoint(Strtol("F338", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'eight.osf')
|
||||
Select(UCodePoint(Strtol("F339", 16)));
|
||||
AddPosSub(@lnum_lu + " subtable", 'nine.osf')
|
||||
|
||||
|
||||
############################ PNUM ####################################
|
||||
############################ PNUM ####################################
|
||||
############################ PNUM ####################################
|
||||
|
||||
Print(GetLookupSubtables(@pnum_lu))
|
||||
RemoveLookupSubtable(@pnum_lu + " subtable")
|
||||
AddLookupSubtable(@pnum_lu, @pnum_lu + " subtable")
|
||||
|
||||
Select(UCodePoint(Strtol("F130", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'zero')
|
||||
Select(UCodePoint(Strtol("F131", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'one')
|
||||
Select(UCodePoint(Strtol("F132", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'two')
|
||||
Select(UCodePoint(Strtol("F133", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'three')
|
||||
Select(UCodePoint(Strtol("F134", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'four')
|
||||
Select(UCodePoint(Strtol("F135", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'five')
|
||||
Select(UCodePoint(Strtol("F136", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'six')
|
||||
Select(UCodePoint(Strtol("F137", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'seven')
|
||||
Select(UCodePoint(Strtol("F138", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'eight')
|
||||
Select(UCodePoint(Strtol("F139", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'nine')
|
||||
|
||||
Select(UCodePoint(Strtol("F330", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'zero.osf')
|
||||
Select(UCodePoint(Strtol("F331", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'one.osf')
|
||||
Select(UCodePoint(Strtol("F332", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'two.osf')
|
||||
Select(UCodePoint(Strtol("F333", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'three.osf')
|
||||
Select(UCodePoint(Strtol("F334", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'four.osf')
|
||||
Select(UCodePoint(Strtol("F335", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'five.osf')
|
||||
Select(UCodePoint(Strtol("F336", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'six.osf')
|
||||
Select(UCodePoint(Strtol("F337", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'seven.osf')
|
||||
Select(UCodePoint(Strtol("F338", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'eight.osf')
|
||||
Select(UCodePoint(Strtol("F339", 16)));
|
||||
AddPosSub(@pnum_lu + " subtable", 'nine.osf')
|
||||
|
||||
|
||||
############################ TNUM ####################################
|
||||
############################ TNUM ####################################
|
||||
############################ TNUM ####################################
|
||||
|
||||
|
||||
Print(GetLookupSubtables(@tnum_lu))
|
||||
RemoveLookupSubtable(@tnum_lu + " subtable")
|
||||
AddLookupSubtable(@tnum_lu, @tnum_lu + " subtable")
|
||||
|
||||
Select(UCodePoint(Strtol("0030", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'zero.tf')
|
||||
Select(UCodePoint(Strtol("0031", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'one.tf')
|
||||
Select(UCodePoint(Strtol("0032", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'two.tf')
|
||||
Select(UCodePoint(Strtol("0033", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'three.tf')
|
||||
Select(UCodePoint(Strtol("0034", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'four.tf')
|
||||
Select(UCodePoint(Strtol("0035", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'five.tf')
|
||||
Select(UCodePoint(Strtol("0036", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'six.tf')
|
||||
Select(UCodePoint(Strtol("0037", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'seven.tf')
|
||||
Select(UCodePoint(Strtol("0038", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'eight.tf')
|
||||
Select(UCodePoint(Strtol("0039", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'nine.tf')
|
||||
|
||||
Select(UCodePoint(Strtol("F230", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'zero.tosf')
|
||||
Select(UCodePoint(Strtol("F231", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'one.tosf')
|
||||
Select(UCodePoint(Strtol("F232", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'two.tosf')
|
||||
Select(UCodePoint(Strtol("F233", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'three.tosf')
|
||||
Select(UCodePoint(Strtol("F234", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'four.tosf')
|
||||
Select(UCodePoint(Strtol("F235", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'five.tosf')
|
||||
Select(UCodePoint(Strtol("F236", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'six.tosf')
|
||||
Select(UCodePoint(Strtol("F237", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'seven.tosf')
|
||||
Select(UCodePoint(Strtol("F238", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'eight.tosf')
|
||||
Select(UCodePoint(Strtol("F239", 16)));
|
||||
AddPosSub(@tnum_lu + " subtable", 'nine.tosf')
|
||||
|
||||
|
||||
############################ ONUM ####################################
|
||||
############################ ONUM ####################################
|
||||
############################ ONUM ####################################
|
||||
|
||||
|
||||
Print(GetLookupSubtables(@onum_lu))
|
||||
RemoveLookupSubtable(@onum_lu + " subtable")
|
||||
AddLookupSubtable(@onum_lu, @onum_lu + " subtable")
|
||||
|
||||
Select(UCodePoint(Strtol("0030", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'zero.osf')
|
||||
Select(UCodePoint(Strtol("0031", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'one.osf')
|
||||
Select(UCodePoint(Strtol("0032", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'two.osf')
|
||||
Select(UCodePoint(Strtol("0033", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'three.osf')
|
||||
Select(UCodePoint(Strtol("0034", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'four.osf')
|
||||
Select(UCodePoint(Strtol("0035", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'five.osf')
|
||||
Select(UCodePoint(Strtol("0036", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'six.osf')
|
||||
Select(UCodePoint(Strtol("0037", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'seven.osf')
|
||||
Select(UCodePoint(Strtol("0038", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'eight.osf')
|
||||
Select(UCodePoint(Strtol("0039", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'nine.osf')
|
||||
|
||||
Select(UCodePoint(Strtol("F130", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'zero.tosf')
|
||||
Select(UCodePoint(Strtol("F131", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'one.tosf')
|
||||
Select(UCodePoint(Strtol("F132", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'two.tosf')
|
||||
Select(UCodePoint(Strtol("F133", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'three.tosf')
|
||||
Select(UCodePoint(Strtol("F134", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'four.tosf')
|
||||
Select(UCodePoint(Strtol("F135", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'five.tosf')
|
||||
Select(UCodePoint(Strtol("F136", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'six.tosf')
|
||||
Select(UCodePoint(Strtol("F137", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'seven.tosf')
|
||||
Select(UCodePoint(Strtol("F138", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'eight.tosf')
|
||||
Select(UCodePoint(Strtol("F139", 16)));
|
||||
AddPosSub(@onum_lu + " subtable", 'nine.tosf')
|
||||
|
||||
|
||||
############################ NUMR ####################################
|
||||
############################ NUMR ####################################
|
||||
############################ NUMR ####################################
|
||||
|
||||
|
||||
Print(GetLookupSubtables(@numr_lu))
|
||||
RemoveLookupSubtable(@numr_lu + " subtable")
|
||||
AddLookupSubtable(@numr_lu, @numr_lu + " subtable")
|
||||
|
||||
Select(UCodePoint(Strtol("0030", 16)));
|
||||
AddPosSub(@numr_lu + " subtable", 'zero.numr')
|
||||
Select(UCodePoint(Strtol("0031", 16)));
|
||||
AddPosSub(@numr_lu + " subtable", 'one.numr')
|
||||
Select(UCodePoint(Strtol("0032", 16)));
|
||||
AddPosSub(@numr_lu + " subtable", 'two.numr')
|
||||
Select(UCodePoint(Strtol("0033", 16)));
|
||||
AddPosSub(@numr_lu + " subtable", 'three.numr')
|
||||
Select(UCodePoint(Strtol("0034", 16)));
|
||||
AddPosSub(@numr_lu + " subtable", 'four.numr')
|
||||
Select(UCodePoint(Strtol("0035", 16)));
|
||||
AddPosSub(@numr_lu + " subtable", 'five.numr')
|
||||
Select(UCodePoint(Strtol("0036", 16)));
|
||||
AddPosSub(@numr_lu + " subtable", 'six.numr')
|
||||
Select(UCodePoint(Strtol("0037", 16)));
|
||||
AddPosSub(@numr_lu + " subtable", 'seven.numr')
|
||||
Select(UCodePoint(Strtol("0038", 16)));
|
||||
AddPosSub(@numr_lu + " subtable", 'eight.numr')
|
||||
Select(UCodePoint(Strtol("0039", 16)));
|
||||
AddPosSub(@numr_lu + " subtable", 'nine.numr')
|
||||
|
||||
|
||||
############################ DNOM ####################################
|
||||
############################ DNOM ####################################
|
||||
############################ DNOM ####################################
|
||||
|
||||
|
||||
Print(GetLookupSubtables(@dnom_lu))
|
||||
RemoveLookupSubtable(@dnom_lu + " subtable")
|
||||
AddLookupSubtable(@dnom_lu, @dnom_lu + " subtable")
|
||||
|
||||
Select(UCodePoint(Strtol("0030", 16)));
|
||||
AddPosSub(@dnom_lu + " subtable", 'zero.dnom')
|
||||
Select(UCodePoint(Strtol("0031", 16)));
|
||||
AddPosSub(@dnom_lu + " subtable", 'one.dnom')
|
||||
Select(UCodePoint(Strtol("0032", 16)));
|
||||
AddPosSub(@dnom_lu + " subtable", 'two.dnom')
|
||||
Select(UCodePoint(Strtol("0033", 16)));
|
||||
AddPosSub(@dnom_lu + " subtable", 'three.dnom')
|
||||
Select(UCodePoint(Strtol("0034", 16)));
|
||||
AddPosSub(@dnom_lu + " subtable", 'four.dnom')
|
||||
Select(UCodePoint(Strtol("0035", 16)));
|
||||
AddPosSub(@dnom_lu + " subtable", 'five.dnom')
|
||||
Select(UCodePoint(Strtol("0036", 16)));
|
||||
AddPosSub(@dnom_lu + " subtable", 'six.dnom')
|
||||
Select(UCodePoint(Strtol("0037", 16)));
|
||||
AddPosSub(@dnom_lu + " subtable", 'seven.dnom')
|
||||
Select(UCodePoint(Strtol("0038", 16)));
|
||||
AddPosSub(@dnom_lu + " subtable", 'eight.dnom')
|
||||
Select(UCodePoint(Strtol("0039", 16)));
|
||||
AddPosSub(@dnom_lu + " subtable", 'nine.dnom')
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Print("Generate " + $1 + '-edited.otf')
|
||||
Generate($1 + '-edited.otf');
|
||||
Quit(0);
|
||||
|
||||
+3164
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,6 @@
|
||||
---
|
||||
:scaling: 95
|
||||
:copyright: "Based on Noto SemiCondensed (Noto: Copyright 2015 Google Inc. All Rights Reserved.)"
|
||||
:ascent: 754
|
||||
:descent: 246
|
||||
:version: "1.04"
|
||||
@@ -0,0 +1,17 @@
|
||||
require "#{File.dirname(File.expand_path(__FILE__))}/extract_info_lib.rb"
|
||||
require 'yaml'
|
||||
|
||||
base_font_directory = ARGV[0]
|
||||
search_font_directory = ARGV[1]
|
||||
|
||||
base_font_infos = {}
|
||||
|
||||
|
||||
|
||||
(Dir.glob("#{base_font_directory}/*.[ot]tf") + Dir.glob("#{base_font_directory}/**/*.[ot]tf")).each{|font_file|
|
||||
_infos = extract_infos_for_font(font_file)
|
||||
base_font_infos[_infos['Family']] = {} unless base_font_infos[_infos['Family']]
|
||||
base_font_infos[_infos.delete('Family')][_infos.delete('Subfamily')] = _infos
|
||||
}
|
||||
|
||||
puts base_font_infos.to_yaml
|
||||
@@ -0,0 +1,38 @@
|
||||
def extract_infos_for_font(font_file)
|
||||
infos_string = `otfinfo -i '#{font_file}'`
|
||||
unless $?.to_i == 0
|
||||
infos = {}
|
||||
else
|
||||
infos = {}
|
||||
key = nil
|
||||
infos_string.each_line{|line|
|
||||
if not(line =~ /^This license is/) and line =~ /(?=\n|^)([A-Za-z ]+):[[:space:]]/
|
||||
if key and infos[key]
|
||||
infos[key] = infos[key].strip
|
||||
end
|
||||
key = $1
|
||||
line.gsub!(/(?=\n|^)([A-Za-z ]+):[[:space:]]/,'')
|
||||
end
|
||||
if key
|
||||
if infos[key]
|
||||
infos[key] += line
|
||||
else
|
||||
infos[key] = line
|
||||
end
|
||||
end
|
||||
}
|
||||
if key and infos[key]
|
||||
infos[key] = infos[key].strip
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
features = `otfinfo -f '#{font_file}'`.lines.to_a.collect{|line| line.split(/[[:space:]]+/,2).collect(&:strip)}
|
||||
features = [] unless $?.to_i == 0
|
||||
|
||||
glyphs = `otfinfo -u '#{font_file}'`.lines.to_a.collect{|line| line.strip.split(/[[:space:]]+/)}
|
||||
glyphs = [] unless $?.to_i == 0
|
||||
return infos.merge(:features => features, :glyphs => glyphs)
|
||||
|
||||
end
|
||||
@@ -0,0 +1,390 @@
|
||||
# coding: utf-8
|
||||
require "yaml"
|
||||
require "csv"
|
||||
require "unicode/categories"
|
||||
class FontManager
|
||||
|
||||
require "#{File.dirname(__FILE__)}/models/font_db_connection.rb"
|
||||
require "#{File.dirname(__FILE__)}/models/feature.rb"
|
||||
require "#{File.dirname(__FILE__)}/models/font_feature.rb"
|
||||
require "#{File.dirname(__FILE__)}/models/font_glyph.rb"
|
||||
require "#{File.dirname(__FILE__)}/models/font.rb"
|
||||
require "#{File.dirname(__FILE__)}/models/glyph.rb"
|
||||
require "#{File.dirname(__FILE__)}/extract_info_lib.rb"
|
||||
require "#{File.dirname(__FILE__)}/extract_info_lib.rb"
|
||||
require "#{File.dirname(__FILE__)}/pdf_creator.rb"
|
||||
|
||||
RANKING_CONFIGURATION = {
|
||||
:features => 1,
|
||||
:glyphs => 10,
|
||||
:sub_families => 50
|
||||
}
|
||||
|
||||
DIACRITICS = ("0300".hex.."036F".hex).to_a + ("1AB0".hex.."1AFF".hex).to_a + ("1DC0".hex.."1DFF".hex).to_a + ("20D0".hex.."20FF".hex).to_a + ("FE20".hex.."FE2F".hex).to_a
|
||||
|
||||
SERIF_FAMILIES = ["EB Garamond 08", "Literata Book Medium", "Literata Book SemiBold", "Literata", "Alegreya Black", "Alegreya ExtraBold", "Alegreya Medium", "EB Garamond 12", "Libertinus Serif Semibold", "Noto Serif Blk", "Noto Serif Cond Blk", "Noto Serif Cond ExtBd", "Noto Serif Cond ExtLt", "Noto Serif Cond Light", "Noto Serif Cond Med", "Noto Serif Cond SemBd", "Noto Serif Cond Thin", "Noto Serif ExtBd", "Noto Serif ExtCond Blk", "Noto Serif ExtCond ExtBd", "Noto Serif ExtCond ExtLt", "Noto Serif ExtCond Light", "Noto Serif ExtCond Med", "Noto Serif ExtCond SemBd", "Noto Serif ExtCond Thin", "Noto Serif ExtLt", "Noto Serif Light", "Noto Serif Med", "Noto Serif SemBd", "Noto Serif SemCond Blk", "Noto Serif SemCond ExtBd", "Noto Serif SemCond ExtLt", "Noto Serif SemCond Light", "Noto Serif SemCond Med", "Noto Serif SemCond SemBd", "Noto Serif SemCond Thin", "Noto Serif Thin", "Alegreya", "Literata Book", "Linux Libertine O", "Libertinus Serif", "Noto Serif Cond", "Noto Serif ExtCond", "Noto Serif SemCond", "Noto Serif"]
|
||||
|
||||
SANS_SERIF_FAMILIES = ["Fira Sans Condensed ExtraLight", "Fira Sans Condensed ExtraBold", "Fira Sans Condensed Light", "Fira Sans Condensed Medium", "Fira Sans Condensed SemiBold", "Fira Sans Condensed Thin", "Fira Sans Compressed ExtraBold", "Fira Sans Compressed Heavy", "Fira Sans Compressed Medium", "Fira Sans Compressed SemiBold", "Fira Sans Compressed Book", "Fira Sans Compressed Eight", "Fira Sans Compressed ExtraLight", "Fira Sans Compressed Four", "Fira Sans Compressed Hair", "Fira Sans Compressed Light", "Fira Sans Compressed Thin", "Fira Sans Compressed Two", "Fira Sans Compressed UltraLight", "Fira Sans Eight", "Fira Sans Four", "Fira Sans Hair", "Fira Sans Two", "Fira Sans Ultra", "Fira Sans Black", "Fira Sans Condensed Black", "Fira Sans Extra Condensed Black", "Fira Sans Extra Condensed ExtraBold", "Fira Sans Extra Condensed ExtraLight", "Fira Sans Extra Condensed Light", "Fira Sans Extra Condensed Medium", "Fira Sans Extra Condensed SemiBold", "Fira Sans Extra Condensed Thin", "Fira Sans Book", "Fira Sans ExtraBold", "Fira Sans ExtraLight", "Fira Sans Heavy", "Fira Sans SemiBold", "Fira Sans Thin", "Fira Sans UltraLight", "Fira Sans Light", "Fira Sans Medium", "Alegreya Sans Black", "Alegreya Sans ExtraBold", "Alegreya Sans Light", "Alegreya Sans Medium", "Alegreya Sans Thin", "Noto Sans Blk", "Noto Sans Cond Blk", "Noto Sans Cond ExtBd", "Noto Sans Cond ExtLt", "Noto Sans Cond Light", "Noto Sans Cond Med", "Noto Sans Cond SemBd", "Noto Sans Cond Thin", "Noto Sans ExtBd", "Noto Sans ExtCond Blk", "Noto Sans ExtCond ExtBd", "Noto Sans ExtCond ExtLt", "Noto Sans ExtCond Light", "Noto Sans ExtCond Med", "Noto Sans ExtCond SemBd", "Noto Sans ExtCond Thin", "Noto Sans ExtLt", "Noto Sans Light", "Noto Sans Med", "Noto Sans SemBd", "Noto Sans SemCond Blk", "Noto Sans SemCond ExtBd", "Noto Sans SemCond ExtLt", "Noto Sans SemCond Light", "Noto Sans SemCond Med", "Noto Sans SemCond SemBd", "Noto Sans SemCond Thin", "Noto Sans Thin", "Libertinus Sans", "Fira Sans Condensed", "Alegreya Sans", "Fira Sans", "Fira Sans Compressed", "Fira Sans Extra Condensed", "Noto Sans", "Noto Sans Cond", "Noto Sans ExtCond", "Noto Sans SemCond", "Linux Biolinum O"]
|
||||
|
||||
LOW_GLYPH_COVERAGE = ["PT Serif", "Junicode", "Libre Caslon Text", "PT Serif Caption", "Fanwood Text", "Alegreya Sans", "Fira Sans", "Fira Sans Condensed", "Alegreya Sans Thin", "Alegreya Sans Medium", "Alegreya Sans ExtraBold", "Alegreya Sans Black", "Fira Sans Condensed Thin", "Fira Sans Condensed Thin", "Fira Sans Condensed SemiBold", "Fira Sans Condensed Medium", "Fira Sans Condensed Light", "Fira Sans Condensed ExtraBold", "Fira Sans Condensed ExtraLight", "Alegreya Sans Light", "Alegreya", "Alegreya Medium", "Alegreya ExtraBold", "Alegreya Black", "EB Garamond 08"]
|
||||
|
||||
SENSELESS_FONTS = ["Fira Sans Two", "Fira Sans Hair", "Fira Sans Four", "Fira Sans Eight", "Fira Sans Compressed Two", "Fira Sans Compressed Four", "Fira Sans Compressed Eight"]
|
||||
|
||||
NO_FRENCH_REN_ANTIGUA_FONTS = ["Noto Serif", "Noto Serif Blk", "Noto Serif Cond Blk", "Noto Serif Cond ExtBd", "Noto Serif Cond ExtLt", "Noto Serif Cond Light", "Noto Serif Cond Med", "Noto Serif Cond SemBd", "Noto Serif Cond Thin", "Noto Serif ExtBd", "Noto Serif ExtCond Blk", "Noto Serif ExtCond ExtBd", "Noto Serif ExtCond ExtLt", "Noto Serif ExtCond Light", "Noto Serif ExtCond Med", "Noto Serif ExtCond SemBd", "Noto Serif ExtCond Thin", "Noto Serif ExtLt", "Noto Serif Light", "Noto Serif Med", "Noto Serif SemBd", "Noto Serif SemCond Blk", "Noto Serif SemCond ExtBd", "Noto Serif SemCond ExtLt", "Noto Serif SemCond Light", "Noto Serif SemCond Med", "Noto Serif SemCond SemBd", "Noto Serif SemCond Thin", "Noto Serif Thin", "Noto Serif Cond", "Noto Serif ExtCond", "Noto Serif SemCond", "Literata Book", "Literata Book"]
|
||||
|
||||
|
||||
|
||||
class << self
|
||||
def fill_font_lib(directory)
|
||||
font_files = (Dir.glob("#{directory}/*.[ot]tf") + Dir.glob("#{directory}/**/*.[ot]tf"))
|
||||
font_files.sort!
|
||||
count = font_files.length
|
||||
font_files.each_with_index{|font_file, index|
|
||||
|
||||
puts "#{(index + 1).to_s.rjust(7)}/#{count} (#{(((index + 1)/count.to_f)*100).round(2)}%) #{font_file}"
|
||||
font_info_hash = extract_infos_for_font(font_file)
|
||||
import_into_db(font_file, font_info_hash)
|
||||
}
|
||||
end
|
||||
|
||||
def import_into_db(font_file, info_hash)
|
||||
begin
|
||||
raise "Name, Family und Subfamily werden erwartet (gefunden: #{info_hash.keys}) #{font_file}" unless info_hash["Family"] and (info_hash["Subfamily"] or info_hash["Preferred subfamily"]) and info_hash["Full name"]
|
||||
font = Font.where(:name => info_hash["Full name"], :family => info_hash["Family"], :sub_family => (info_hash["Subfamily"] ? info_hash["Subfamily"] : info_hash["Preferred subfamily"])).first_or_initialize
|
||||
font.add_file_location(font_file)
|
||||
font.add_infos_from_hash(info_hash)
|
||||
font.save!
|
||||
rescue StandardError => e
|
||||
puts "Problem mit #{font_file}"
|
||||
puts e.message
|
||||
end
|
||||
end
|
||||
|
||||
def all_fonts
|
||||
Font.all
|
||||
end
|
||||
|
||||
def create_csv(csv_file_name: 'config/chars.csv', base_font_name: 'De-Gruyter-Regular', first_alt_sans_font_family: 'Noto Sans SemCond', first_alt_serif_font_family: 'Noto Serif SemCond')
|
||||
all_unicode_points = Font.where(name: base_font_name).first.glyphs.pluck(:unicode_point)
|
||||
all_unicode_points += (Font.where(family: first_alt_sans_font_family).first.glyph_code_points_contained_in_all_sub_families & Font.where(family: first_alt_serif_font_family).first.glyph_code_points_contained_in_all_sub_families)
|
||||
all_unicode_points.uniq!
|
||||
all_unicode_points.sort!
|
||||
|
||||
sans_regular_alt = Font.where(family: first_alt_sans_font_family).first.regular_font
|
||||
sans_italic_alt = Font.where(family: first_alt_sans_font_family).first.italic_font
|
||||
sans_bold_alt = Font.where(family: first_alt_sans_font_family).first.bold_font
|
||||
sans_bold_italic_alt = Font.where(family: first_alt_sans_font_family).first.bold_italic_font
|
||||
|
||||
serif_regular_alt = Font.where(family: first_alt_serif_font_family).first.regular_font
|
||||
serif_italic_alt = Font.where(family: first_alt_serif_font_family).first.italic_font
|
||||
serif_bold_alt = Font.where(family: first_alt_serif_font_family).first.bold_font
|
||||
serif_bold_italic_alt = Font.where(family: first_alt_serif_font_family).first.bold_italic_font
|
||||
|
||||
|
||||
sans_regular_alt_file = File.basename(sans_regular_alt.file_locations.first)
|
||||
sans_italic_alt_file = File.basename(sans_italic_alt.file_locations.first)
|
||||
sans_bold_alt_file = File.basename(sans_bold_alt.file_locations.first)
|
||||
sans_bold_italic_alt_file = File.basename(sans_bold_italic_alt.file_locations.first)
|
||||
|
||||
|
||||
serif_regular_alt_file = File.basename(serif_regular_alt.file_locations.first)
|
||||
serif_italic_alt_file = File.basename(serif_italic_alt.file_locations.first)
|
||||
serif_bold_alt_file = File.basename(serif_bold_alt.file_locations.first)
|
||||
serif_bold_italic_alt_file = File.basename(serif_bold_italic_alt.file_locations.first)
|
||||
|
||||
|
||||
CSV::open(csv_file_name, 'w:utf-8', col_sep: ';') do |csv_object|
|
||||
csv_object << ["char",'codepoint','sans-regular','sans-italic','sans-bold','sans-bold-italic','serif-regular','serif-italic','serif-bold','serif-bold-italic',"in-#{base_font_name.downcase}"]
|
||||
all_unicode_points.each do |unicode_point|
|
||||
code_point = unicode_point.gsub('uni','')
|
||||
char = code_point.hex.chr(Encoding::UTF_8)
|
||||
|
||||
sans_regular = (sans_regular_alt.glyphs.where(unicode_point: unicode_point).exists? ? sans_regular_alt_file : nil)
|
||||
sans_italic = (sans_italic_alt.glyphs.where(unicode_point: unicode_point).exists? ? sans_italic_alt_file : nil)
|
||||
sans_bold = (sans_bold_alt.glyphs.where(unicode_point: unicode_point).exists? ? sans_bold_alt_file : nil)
|
||||
sans_bold_italic = (sans_bold_italic_alt.glyphs.where(unicode_point: unicode_point).exists? ? sans_bold_italic_alt_file : nil)
|
||||
|
||||
serif_regular = (serif_regular_alt.glyphs.where(unicode_point: unicode_point).exists? ? serif_regular_alt_file : nil)
|
||||
serif_italic = (serif_italic_alt.glyphs.where(unicode_point: unicode_point).exists? ? serif_italic_alt_file : nil)
|
||||
serif_bold = (serif_bold_alt.glyphs.where(unicode_point: unicode_point).exists? ? serif_bold_alt_file : nil)
|
||||
serif_bold_italic = (serif_bold_italic_alt.glyphs.where(unicode_point: unicode_point).exists? ? serif_bold_italic_alt_file : nil)
|
||||
|
||||
in_base = Font.where(name: base_font_name).first.glyphs.where(unicode_point: unicode_point).exists?
|
||||
|
||||
csv_object << [char, code_point, sans_regular, sans_italic, sans_bold, sans_bold_italic, serif_regular, serif_italic, serif_bold, serif_bold_italic, in_base]
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
def find_alternative_family(source_family,
|
||||
must_have_features: ["c2sc", "case", "ccmp", "frac", "kern", "liga", "onum", "pnum", "tnum", "smcp"],
|
||||
must_have_glyphs: [
|
||||
"uni0041", # A -> Latin
|
||||
"uni00C0", # À -> Latin extended
|
||||
"uni0396", # Ζ -> griechisch
|
||||
"uni1F00" # ἀ -> altgriechisch
|
||||
])
|
||||
font = Font.where(:family => source_family).first
|
||||
source_sub_families = font.sub_families
|
||||
source_glyph_code_points = font.glyph_code_points_contained_in_all_sub_families
|
||||
source_features = font.feature_short_names_contained_in_all_sub_families
|
||||
source_sub_families_count = source_sub_families.length
|
||||
source_glyph_code_points_count = source_glyph_code_points.length
|
||||
source_features_count = source_features.length
|
||||
|
||||
all_fonts = Font.all
|
||||
fonts_with_all_must_have_features = all_fonts.select{|font| (must_have_features - font.features.pluck(:short_name)).empty?}
|
||||
fonts_with_all_must_have_glyphs_and_all_must_have_features = fonts_with_all_must_have_features.select{|font| (must_have_glyphs - font.glyphs.pluck(:unicode_point)).empty?}
|
||||
other_families_array = (fonts_with_all_must_have_glyphs_and_all_must_have_features.collect(&:family) - [source_family]).uniq.collect{|other_family|
|
||||
first_family_font = Font.where(:family => other_family).first
|
||||
|
||||
_sub_families = first_family_font.sub_families
|
||||
_glyph_code_points = first_family_font.glyph_code_points_contained_in_all_sub_families
|
||||
_features = first_family_font.feature_short_names_contained_in_all_sub_families
|
||||
missing_sub_families_count = (source_sub_families - _sub_families).length
|
||||
missing_glyph_code_points_count = (source_glyph_code_points - _glyph_code_points).length
|
||||
missing_features_count = (source_features - _features).length
|
||||
percentage_sub_families = ((source_sub_families_count - missing_sub_families_count) / source_sub_families_count.to_f)
|
||||
percentage_glyphs = ((source_glyph_code_points_count - missing_glyph_code_points_count) / source_glyph_code_points_count.to_f)
|
||||
percentage_features = ((source_features_count - missing_features_count) / source_features_count.to_f)
|
||||
[percentage_sub_families, percentage_glyphs, percentage_features, other_family, first_family_font]
|
||||
}.sort_by{|family_array|
|
||||
percentage_sub_families = family_array[0]
|
||||
percentage_glyphs = family_array[1]
|
||||
percentage_features = family_array[2]
|
||||
other_family = family_array[3]
|
||||
|
||||
###
|
||||
### Calculate Ranking
|
||||
|
||||
((percentage_sub_families * RANKING_CONFIGURATION[:sub_families]) + (percentage_glyphs * RANKING_CONFIGURATION[:glyphs]) + (percentage_features * RANKING_CONFIGURATION[:features])) / (RANKING_CONFIGURATION[:sub_families] + RANKING_CONFIGURATION[:glyphs] + RANKING_CONFIGURATION[:features]).to_f
|
||||
}
|
||||
|
||||
other_families_array.reject!{|family_array|
|
||||
(["Regular", "Italic"] - family_array[4].family_fonts.pluck(:sub_family)).length > 0
|
||||
}
|
||||
|
||||
other_families_array.each{|family_array|
|
||||
percentage_sub_families = family_array[0]
|
||||
percentage_glyphs = family_array[1]
|
||||
percentage_features = family_array[2]
|
||||
other_family = family_array[3]
|
||||
font = family_array[4]
|
||||
|
||||
puts "#{font.id.to_s.ljust(6)} #{other_family.ljust(60)} #{(percentage_sub_families * 100).to_s.ljust(5)} #{(percentage_glyphs * 100).round(2).to_s.ljust(5)} #{(percentage_features * 100).to_s.ljust(5)} #{font.family_fonts.pluck(:sub_family).join(", ")}"
|
||||
}
|
||||
return other_families_array.collect{|family_array| family_array[3]}
|
||||
|
||||
end
|
||||
|
||||
def pdf_for_best_alternative_fonts(source_family, output_pdf: 'test.pdf', exclude: [])
|
||||
other_families = find_alternative_family(source_family)
|
||||
other_families -= exclude
|
||||
#PdfCreator.create_comparison_pdf(output_pdf, other_families.last(limit).reverse, base_font_family: source_family)
|
||||
PdfCreator.create_fonts_tex_pdf(output_pdf, other_families.reverse, source_family)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def create_new_fonts(chars_config_file: 'config/chars.csv', config_file: 'config/config.yaml', source_font_dir: 'source_fonts/', target_font_dir: 'output/', new_font_name: 'De Gruyter', base_font_regex: nil)
|
||||
table = CSV.parse(File.read(chars_config_file), headers: true, col_sep: ';')
|
||||
font_config = YAML.load(File.read(config_file))
|
||||
code_points = table.by_col[1]
|
||||
FileUtils.mkdir_p(target_font_dir) unless File.directory?(target_font_dir)
|
||||
|
||||
table.headers.each_with_index{|table_header, table_header_index|
|
||||
next if table_header == 'char'
|
||||
next if table_header == 'codepoint'
|
||||
next if table_header.start_with?("in-")
|
||||
|
||||
|
||||
all_font_definitions = table.by_col[table_header_index]
|
||||
recombined_fonts = all_font_definitions.compact.select{|fd| fd.gsub(/\([^)]+\)$/,'') != fd}.uniq.collect{|fd| fd.gsub(/\([^)]+\)$/,'')}
|
||||
|
||||
all_used_fonts = table.by_col[table_header_index].collect{|font|
|
||||
if font
|
||||
font.gsub(/\([^)]*\)$/,'')
|
||||
else
|
||||
nil
|
||||
end
|
||||
}
|
||||
used_fonts = all_used_fonts.compact
|
||||
base_font = used_fonts.max_by{|uf| used_fonts.count(uf)}
|
||||
if base_font_regex and regex_base_font = used_fonts.find{|uf| uf =~ base_font_regex}
|
||||
base_font = regex_base_font
|
||||
end
|
||||
|
||||
sub_family = table_header.to_s.gsub("-",' ').split(" ").collect(&:capitalize).join(" ")
|
||||
type = "Sans"
|
||||
if sub_family =~ /Serif/
|
||||
type = "Serif"
|
||||
end
|
||||
sub_family.gsub!("Sans","")
|
||||
sub_family.gsub!("Serif","")
|
||||
sub_family.strip!
|
||||
|
||||
|
||||
puts "##########################################"
|
||||
puts "##########################################"
|
||||
puts "##########################################"
|
||||
puts "Subfamily: #{sub_family}"
|
||||
puts "Type: #{type}"
|
||||
puts "BaseFont: #{base_font}"
|
||||
additional_fonts = recombined_fonts + (used_fonts.uniq - [base_font])
|
||||
additional_fonts.uniq!
|
||||
|
||||
puts "AdditionalFonts: #{additional_fonts}"
|
||||
|
||||
output_font_name = "#{new_font_name.gsub(' ', '-')}-#{type}-#{sub_family.gsub(" ","-")}"
|
||||
output_font_family_name = "#{new_font_name} #{type}"
|
||||
Dir.mktmpdir do |tmp_dir|
|
||||
_tmp_base_font = File.join(source_font_dir, base_font)
|
||||
if additional_fonts.empty?
|
||||
puts "Rename Original Font #{base_font} to #{new_font_name.gsub(' ', '-')}-#{sub_family.gsub(" ","-")}"
|
||||
insert_glyphs_in_font_file(
|
||||
source_font: _tmp_base_font,
|
||||
target_font: _tmp_base_font,
|
||||
output_font_family_name: output_font_family_name,
|
||||
output_font_name: output_font_name,
|
||||
output_path: "#{tmp_dir}/",
|
||||
code_points: []
|
||||
)
|
||||
_tmp_base_font = File.join(tmp_dir, "#{new_font_name.gsub(' ', '-')}-#{type}-#{sub_family.gsub(" ","-")}.otf")
|
||||
else
|
||||
additional_fonts.each{|additional_font|
|
||||
puts "Additional Font #{additional_font}"
|
||||
code_points_to_replace = code_points.select.with_index{|code_point, index|
|
||||
all_used_fonts[index] == additional_font
|
||||
}.collect{|code_point| "uni#{code_point}"}
|
||||
code_points_to_replace = [] if additional_font == base_font
|
||||
|
||||
code_points_to_replace_with_other = code_points.collect.with_index{|code_point, index|
|
||||
if all_font_definitions[index] && all_font_definitions[index].gsub(/\([^)]+\)$/,'') != all_font_definitions[index] && all_font_definitions[index].gsub(/\([^)]+\)$/,'') == additional_font
|
||||
["uni#{code_point}", all_font_definitions[index].gsub(/.*\(([^)]*)\)$/,'\1').codepoints.collect{|cp| "uni#{cp.to_s(16)}"}]
|
||||
else
|
||||
nil
|
||||
end
|
||||
}.compact.to_h
|
||||
|
||||
puts "Insert #{code_points_to_replace} from #{additional_font} into #{_tmp_base_font}"
|
||||
insert_glyphs_in_font_file(
|
||||
source_font: File.join(source_font_dir, additional_font),
|
||||
target_font: _tmp_base_font,
|
||||
output_font_family_name: output_font_family_name,
|
||||
output_font_name: output_font_name,
|
||||
output_path: "#{tmp_dir}/",
|
||||
code_points: code_points_to_replace,
|
||||
code_points_to_replace_with_other: code_points_to_replace_with_other
|
||||
)
|
||||
_tmp_base_font = File.join(tmp_dir, "#{new_font_name.gsub(' ', '-')}-#{type}-#{sub_family.gsub(" ","-")}.otf")
|
||||
puts "AAAAAAAAAAAAAAAAAAA"
|
||||
puts _tmp_base_font
|
||||
puts Dir.glob("#{tmp_dir}/*")
|
||||
|
||||
}
|
||||
end
|
||||
|
||||
adjust_font(
|
||||
source_font_file: _tmp_base_font,
|
||||
target_font_file: "#{target_font_dir}/#{output_font_name}.otf",
|
||||
font_name: output_font_name,
|
||||
family_name: output_font_family_name,
|
||||
weight: sub_family,
|
||||
scaling: font_config[:scaling],
|
||||
ascent: font_config[:ascent],
|
||||
descent: font_config[:descent],
|
||||
version: font_config[:version],
|
||||
copyright: font_config[:copyright]
|
||||
)
|
||||
|
||||
end
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
|
||||
def insert_glyphs_in_font_file(source_font: Font.find(9), target_font: Font.find(2000), output_font_name: "NewFont", output_font_family_name: "NewFont Sans", output_path: "#{File.dirname(__FILE__)}/", code_points: ["uni0041", "uni0393", "uni0394", "uni0395", "uni0396", "uni0397"], code_points_to_replace_with_other: {})
|
||||
puts code_points_to_replace_with_other.to_yaml
|
||||
source_font_location = source_font.file_locations.first if source_font.is_a?(Font)
|
||||
target_font_location = target_font.file_locations.first if target_font.is_a?(Font)
|
||||
source_font_location ||= source_font
|
||||
target_font_location ||= target_font
|
||||
|
||||
|
||||
Dir.mktmpdir do |dir|
|
||||
FileUtils.cp(source_font_location, "#{dir}/source_font#{File.extname(source_font_location)}")
|
||||
FileUtils.cp(target_font_location, "#{dir}/target_font#{File.extname(target_font_location)}")
|
||||
|
||||
unless code_points.empty?
|
||||
File.open("#{dir}/glyphs.txt",'w+'){|file|
|
||||
code_points.each{|code_point| file.puts code_point }
|
||||
}
|
||||
FileUtils.cp("bin/merge_fonts.py", "#{dir}/")
|
||||
puts `cd #{dir}; fontforge -lang=py -script merge_fonts.py glyphs.txt source_font#{File.extname(source_font_location)} #{dir}/target_font#{File.extname(target_font_location)} #{output_font_name} '#{output_font_family_name}'`
|
||||
end
|
||||
|
||||
|
||||
if !code_points_to_replace_with_other.keys.empty?
|
||||
code_points_to_replace_with_other.each{|target_glyph, source_glyphs|
|
||||
if File.exists?("#{dir}/#{output_font_name}.otf")
|
||||
FileUtils.cp("#{dir}/#{output_font_name}.otf", "#{dir}/source_font#{File.extname(source_font_location)}")
|
||||
else
|
||||
FileUtils.cp("#{dir}/target_font#{File.extname(target_font_location)}", "#{dir}/source_font#{File.extname(source_font_location)}")
|
||||
end
|
||||
|
||||
FileUtils.cp("bin/combine_glyphs.ff", "#{dir}/")
|
||||
|
||||
command = "cd #{dir}; fontforge -script combine_glyphs.ff source_font#{File.extname(source_font_location)} #{output_font_name} '#{output_font_family_name}' #{target_glyph} #{source_glyphs.join(" ")}"
|
||||
puts command
|
||||
puts `#{command}`
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
FileUtils.cp("#{dir}/#{output_font_name}.otf", "#{output_path}/")
|
||||
end
|
||||
end
|
||||
|
||||
def adjust_font(source_font_file: , target_font_file:, font_name:, family_name:, unique_id: nil, weight: "Regular", scaling: 1.0, version: 1.00, ascent: 800, descent: 200, copyright: "" )
|
||||
unless unique_id
|
||||
name_1 = font_name.gsub(/[[:punct:][:space:]]/,'').upcase
|
||||
unique_id = "#{version};#{name_1.upcase[0..3]};#{font_name}"
|
||||
end
|
||||
|
||||
command = "fontforge -script #{File.join(File.dirname(__FILE__), '..', 'bin')}/adjust_font.ff #{source_font_file} #{target_font_file} '#{font_name}' '#{weight}' '#{family_name}' '#{unique_id}' '#{version}' '#{copyright}' #{scaling} #{ascent} #{descent}"
|
||||
puts command
|
||||
puts `#{command}`
|
||||
end
|
||||
|
||||
def create_math_font(new_font_name: "De Gruyter", type: "Sans", sub_family: "Regular", config_file: 'config/config.yaml', source_math_font: 'source_fonts/NotoSansMath-Regular.ttf', target_font_dir: "output/", copyright: "Based on Noto Sans Math (Noto: Copyright 2015 Google Inc. All Rights Reserved.)")
|
||||
font_config = YAML.load(File.read(config_file))
|
||||
output_font_name = "#{new_font_name.gsub(' ', '-')}-#{type}-Math-#{sub_family.gsub(" ","-")}"
|
||||
output_font_family_name = "#{new_font_name} #{type} Math"
|
||||
adjust_font(
|
||||
source_font_file: source_math_font,
|
||||
target_font_file: "#{target_font_dir}/#{output_font_name}.otf",
|
||||
font_name: output_font_name,
|
||||
family_name: output_font_family_name,
|
||||
weight: sub_family,
|
||||
scaling: font_config[:scaling],
|
||||
ascent: font_config[:ascent],
|
||||
descent: font_config[:descent],
|
||||
version: font_config[:version],
|
||||
copyright: copyright
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
class Feature < FontDbConnection
|
||||
has_many :font_features
|
||||
has_many :features, through: :font_features
|
||||
end
|
||||
@@ -0,0 +1,181 @@
|
||||
# coding: utf-8
|
||||
class Font < FontDbConnection
|
||||
has_many :font_glyphs
|
||||
has_many :glyphs, -> { distinct }, through: :font_glyphs
|
||||
has_many :font_features
|
||||
has_many :features, -> { distinct }, through: :font_features
|
||||
|
||||
serialize :license, JSON
|
||||
serialize :file_locations, JSON
|
||||
serialize :misc_informations, JSON
|
||||
|
||||
def add_infos_from_hash(hash)
|
||||
add_license_informations(hash)
|
||||
add_misc_informations(hash)
|
||||
add_feature_informations(hash)
|
||||
add_glyph_informations(hash)
|
||||
end
|
||||
|
||||
def add_license_informations(hash)
|
||||
self.license = hash.slice("License", "License URL", "License Description", "Copyright")
|
||||
end
|
||||
|
||||
def add_misc_informations(hash)
|
||||
_hash = hash.dup
|
||||
_hash.delete("Family")
|
||||
_hash.delete("Subfamily")
|
||||
_hash.delete("Full name")
|
||||
_hash.delete("License")
|
||||
_hash.delete("License URL")
|
||||
_hash.delete("License Description")
|
||||
_hash.delete("Copyright")
|
||||
_hash.delete(:features)
|
||||
_hash.delete(:glyphs)
|
||||
self.misc_informations = _hash
|
||||
end
|
||||
|
||||
def add_file_location(location)
|
||||
self.file_locations ||= []
|
||||
self.file_locations << location
|
||||
self.file_locations = self.file_locations.uniq
|
||||
end
|
||||
|
||||
def add_feature_informations(hash)
|
||||
_features = hash[:features]
|
||||
_features.each{|feature|
|
||||
self.features << Feature.where(:short_name => feature[0], :description => feature[1]).first_or_create
|
||||
} if _features
|
||||
end
|
||||
def add_glyph_informations(hash)
|
||||
_glyphs = hash[:glyphs]
|
||||
_glyphs.each{|glyph|
|
||||
self.glyphs << Glyph.where(:unicode_point => glyph[0], :glyph_number => glyph[1], :glyph_description => glyph[2]).first_or_create
|
||||
} if _glyphs
|
||||
end
|
||||
|
||||
|
||||
def feature_short_names
|
||||
features.pluck(:short_name).collect{|short_name|
|
||||
italic = !!(short_name =~ /It/i or short_name =~ /Obl/i)
|
||||
bold = !!(short_name =~ /[B]d/i or short_name =~ /Bold/i)
|
||||
if italic and bold
|
||||
"BoldItalic"
|
||||
elsif italic
|
||||
"Italic"
|
||||
elsif bold
|
||||
"Bold"
|
||||
else
|
||||
"Regular"
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
def feature_short_names_contained_in_all_sub_families
|
||||
family_fonts.collect(&:feature_short_names).inject(nil){|array_containing_all, actual_array|
|
||||
array_containing_all = actual_array if array_containing_all.nil?
|
||||
array_containing_all = array_containing_all & actual_array
|
||||
}
|
||||
end
|
||||
|
||||
def sub_families
|
||||
family_fonts.pluck(:sub_family)
|
||||
end
|
||||
|
||||
def glyph_code_points
|
||||
glyphs.pluck(:unicode_point)
|
||||
end
|
||||
|
||||
def glyph_code_points_contained_in_all_sub_families
|
||||
family_fonts.collect(&:glyph_code_points).inject(nil){|array_containing_all, actual_array|
|
||||
array_containing_all = actual_array if array_containing_all.nil?
|
||||
array_containing_all = array_containing_all & actual_array
|
||||
}
|
||||
end
|
||||
|
||||
def family_fonts
|
||||
Font.where(:family => self.family)
|
||||
end
|
||||
|
||||
def compare_family(source_family)
|
||||
font = Font.where(:family => source_family).first
|
||||
source_sub_families = font.sub_families
|
||||
source_glyph_code_points = font.glyph_code_points_contained_in_all_sub_families
|
||||
source_features = font.feature_short_names_contained_in_all_sub_families
|
||||
source_sub_families_count = source_sub_families.length
|
||||
source_glyph_code_points_count = source_glyph_code_points.length
|
||||
source_features_count = source_features.length
|
||||
|
||||
other_family = self.family
|
||||
first_family_font = Font.where(:family => other_family).first
|
||||
_sub_families = first_family_font.sub_families
|
||||
_glyph_code_points = first_family_font.glyph_code_points_contained_in_all_sub_families
|
||||
_features = first_family_font.feature_short_names_contained_in_all_sub_families
|
||||
|
||||
return {
|
||||
:missing_sub_families_count => (source_sub_families - _sub_families).length,
|
||||
:missing_glyph_code_points_count => (source_glyph_code_points - _glyph_code_points).length,
|
||||
:missing_features_count => (source_features - _features).length,
|
||||
:percentage_sub_families => ((source_sub_families_count - missing_sub_families_count) / source_sub_families_count.to_f),
|
||||
:percentage_glyphs => ((source_glyph_code_points_count - missing_glyph_code_points_count) / source_glyph_code_points_count.to_f),
|
||||
:percentage_features => ((source_features_count - missing_features_count) / source_features_count.to_f)
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
def compare(source_family)
|
||||
source_font = comparison_font(source_family)
|
||||
return {} unless source_font
|
||||
return {
|
||||
:missing_glyph_code_points_count => (source_font.glyph_code_points - self.glyph_code_points).length,
|
||||
:missing_features_count => (source_font.features - self.features).length,
|
||||
:percentage_glyphs => ((source_font.glyph_code_points.length - (source_font.glyph_code_points - self.glyph_code_points).length) / source_font.glyph_code_points.length.to_f) * 100.0,
|
||||
:percentage_features => ((source_font.features.length - (source_font.features - self.features).length) / source_font.features.length.to_f) * 100.0
|
||||
}
|
||||
end
|
||||
|
||||
def comparison_font(source_family)
|
||||
Font.where(:family => source_family, :sub_family => self.sub_family).first
|
||||
end
|
||||
|
||||
|
||||
def replace_missing_glyphs(text)
|
||||
_text = text.dup
|
||||
missing_symbols = (text.codepoints.collect{|cp| "uni" + cp.to_s(16).upcase.rjust(4, '0')} - self.glyphs.pluck(:unicode_point)).collect{|up| up.gsub("uni",'').hex.chr(Encoding::UTF_8)}
|
||||
missing_symbols.each{|ms| _text.gsub!(ms, '□')}
|
||||
return _text
|
||||
end
|
||||
|
||||
|
||||
def fontspec(path)
|
||||
"\\setmainfont{#{File.basename(regular_font&.file_locations&.first).gsub(/[\[\]]/,'_')}}[
|
||||
Path = #{path},
|
||||
BoldFont= #{File.basename(bold_font&.file_locations&.first.to_s).gsub(/[\[\]]/,'_')},
|
||||
ItalicFont = #{File.basename(italic_font&.file_locations&.first.to_s).gsub(/[\[\]]/,'_')},
|
||||
BoldItalicFont = #{File.basename(bold_italic_font&.file_locations&.first.to_s).gsub(/[\[\]]/,'_')}]"
|
||||
|
||||
end
|
||||
|
||||
|
||||
def regular_font
|
||||
Font.where(:family => self.family, :sub_family => 'Regular').first
|
||||
end
|
||||
|
||||
def bold_font
|
||||
Font.where(:family => self.family, :sub_family => 'Bold').first
|
||||
end
|
||||
|
||||
def bold_italic_font
|
||||
Font.where(:family => self.family, :sub_family => 'Bold Italic').first
|
||||
end
|
||||
|
||||
def italic_font
|
||||
Font.where(:family => self.family, :sub_family => 'Italic').first
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
require 'active_record'
|
||||
|
||||
|
||||
class FontDbConnection < ActiveRecord::Base
|
||||
self.abstract_class = true
|
||||
|
||||
ActiveRecord::Base.establish_connection(
|
||||
:adapter => "mysql2",
|
||||
:database => "fonts",
|
||||
:username => 'jasch',
|
||||
:password => 'gehe1m',
|
||||
:encoding => 'utf8'
|
||||
)
|
||||
# ActiveRecord::Schema.define do
|
||||
# create_table :fonts do |table|
|
||||
# table.column :name, :string
|
||||
# table.column :family, :string
|
||||
# table.column :sub_family, :string
|
||||
# table.column :license, :text
|
||||
# table.column :file_locations, :text
|
||||
# table.column :misc_informations, :text
|
||||
# end
|
||||
|
||||
# create_table :features do |table|
|
||||
# table.column :short_name, :string
|
||||
# table.column :description, :string
|
||||
# end
|
||||
|
||||
# create_table :glyphs do |table|
|
||||
# table.column :unicode_point, :string
|
||||
# table.column :glyph_number, :string
|
||||
# table.column :glyph_description, :string
|
||||
# end
|
||||
|
||||
|
||||
# create_table :font_features do |table|
|
||||
# table.column :font_id, :integer, :index => true
|
||||
# table.column :feature_id, :integer, :index => true
|
||||
# end
|
||||
|
||||
# create_table :font_glyphs do |table|
|
||||
# table.column :font_id, :integer, :index => true
|
||||
# table.column :glyph_id, :integer, :index => true
|
||||
# end
|
||||
|
||||
# end
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
class FontFeature < FontDbConnection
|
||||
belongs_to :font
|
||||
belongs_to :feature
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
class FontGlyph < FontDbConnection
|
||||
belongs_to :glyph
|
||||
belongs_to :font
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
class Glyph < FontDbConnection
|
||||
has_many :font_glyphs
|
||||
has_many :fonts, -> { distinct }, through: :font_glyphs
|
||||
|
||||
end
|
||||
@@ -0,0 +1,458 @@
|
||||
# coding: utf-8
|
||||
|
||||
require 'pdfkit'
|
||||
require 'nokogiri'
|
||||
class PdfCreator
|
||||
include Singleton
|
||||
|
||||
BLINDTEXT = "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ abcdefghijklmnopqrstuvwxyzäöüß 1234567890 Dies ist ein Typoblindtext. An ihm kann man sehen, ob alle Buchstaben da sind und wie sie aussehen. Manchmal benutzt man Worte wie Hamburgefonts, Rafgenduks oder Handgloves, um Schriften zu testen. Manchmal Sätze, die alle Buchstaben des Alphabets enthalten – man nennt diese Sätze »Pangrams«. Sehr bekannt ist dieser: The quick brown fox jumps over the lazy old dog. Oft werden in Typoblindtexte auch fremdsprachige Satzteile eingebaut (AVAIL® and Wefox™ are testing aussi la Kerning), um die Wirkung in anderen Sprachen zu testen. In Lateinisch sieht zum Beispiel fast jede Schrift gut aus. Quod erat demonstrandum. Seit 1975 fehlen in den meisten Testtexten die Zahlen, weswegen nach TypoGb. 204 § ab dem Jahr 2034 Zahlen in 86 der Texte zur Pflicht werden. Nichteinhaltung wird mit bis zu 245 € oder 368 $ bestraft. Genauso wichtig in sind mittlerweile auch Âçcèñtë, die in neueren Schriften aber fast immer enthalten sind. Ein wichtiges aber schwierig zu integrierendes Feld sind OpenType-Funktionalitäten. Je nach Software und Voreinstellungen können eingebaute Kapitälchen, Kerning oder Ligaturen (sehr pfiffig) nicht richtig dargestellt werden. Griechisches Lorem Ipsum: Λορεμ ιπσθμ δολορ σιτ αμετ, νοvθμ φαβελλασ πετεντιθμ vελ νε, ατ νισλ σονετ οπορτερε εθμ. Αλιι δοcτθσ μει ιδ, νο αθτεμ αθδιρε ιντερεσσετ μελ, δοcενδι cομμθνε οπορτεατ τε cθμ. Russisches Lorem Ipsum: Лорем ипсум долор сит амет, пер цлита поссит ех, ат мунере фабулас петентиум сит. Иус цу цибо саперет сцрипсерит, нец виси муциус лабитур ид. Ет хис нонумес нолуиссе дигниссим."
|
||||
|
||||
|
||||
TEX_HEADER = <<-END
|
||||
\\documentclass[10pt,twocolumn]{report}
|
||||
\\usepackage{geometry}
|
||||
\\geometry{
|
||||
a4paper,
|
||||
total={190mm,277mm},
|
||||
left=10mm,
|
||||
top=10mm,
|
||||
}
|
||||
\\usepackage{fontspec}
|
||||
\\setlength{\\parindent}{0pt}
|
||||
\\pagestyle{empty}
|
||||
\\begin{document}
|
||||
|
||||
\\newcommand{\\blindtext}{%
|
||||
\\noindent{}aäb cde fgh ijk lmn oöp qrsß tuü vwx yz AÄBC DEF GHI JKL MNO ÖPQ RST UÜV WXYZ !"§ \\$\\%\\& /() =?* ' \\# \\symbol{"7E} ²³ @`´ ©«» ¼ \\{\\} € - -- ---
|
||||
|
||||
Zwei flinke Boxer jagen die quirlige Eva und ihren Mops durch Sylt. Franz jagt im komplett verwahrlosten Taxi quer durch
|
||||
Bayern. Zwölf Boxkämpfer jagen Viktor quer über den großen Sylter Deich. Vogel Quax zwickt Johnys Pferd Bim. Sylvia wagt quick
|
||||
den Jux bei Pforzheim. Polyfon zwitschernd aßen Mäxchens Vögel Rüben, Joghurt und Quark. ,,Fix, Schwyz!'' quäkt Jürgen blöd vom
|
||||
Paß. Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich. Falsches Üben von Xylophonmusik quält jeden größeren
|
||||
Zwerg. Heizölrückstoßabdämpfung.
|
||||
|
||||
%% Ligaturen: ff, fi, fl, ft, ffi, ffl, fk, fj, fh, fb, fz, ll, st, ch, ck, ct, th, tt, tz, kk, Qu, ſi, ſſ, ſt, ſch
|
||||
%%
|
||||
%% Λορεμ ιπσθμ δολορ σιτ αμετ, νοvθμ φαβελλασ πετεντιθμ vελ νε, ατ νισλ σονετ οπορτερε εθμ. Αλιι δοcτθσ μει ιδ, νο αθτεμ αθδιρε ιντερεσσετ μελ, δοcενδι cομμθνε οπορτεατ τε cθμ.
|
||||
%%
|
||||
%% Лорем ипсум долор сит амет, пер цлита поссит ех, ат мунере фабулас петентиум сит. Иус цу цибо саперет сцрипсерит, нец виси муциус лабитур ид. Ет хис нонумес нолуиссе дигниссим.
|
||||
%%
|
||||
%% ÀÁ ÃÄÅ ÆÇÈ ÉÊË ÌÍÎ ÏÐÑ ÒÓÔ ÕÖ× ØÙÚ ÛÜÝ Þßà áâã äåæ çèé êëì íîï ðñò óôõ ö÷ø ùúû üýþ ÿ Āāà 㥹 ĆćĈ ĉĊċ ČčĎ ďĐđ ĒēĔ ĕĖė ĘęĚ ěĜĝ ĞğĠ ġĢģ ĤĥĦ ħĨĩ ĪīĬ ĭĮį İıIJ ijĴĵ Ķķĸ ĹĺĻ ļĽľ ĿŀŁ łŃń ŅņŇ ňʼnŊ ŋŌō ŎŏŐ őŒœ ŔŕŖ ŗŘř ŚśŜ ŝŞş ŠšŢ ţŤť ŦŧŨ ũŪū ŬŭŮ ůŰű ŲųŴ ŵŶŷ ŸŹź ŻżŽ žſ ḀḁḂ ḃḄḅ ḆḇḈ ḉḊḋ ḌḍḎ ḏḐḑ ḒḓḔ ḕḖḗ ḘḙḚ ḛḜḝ ḞḟḠ ḡḢḣ ḤḥḦ ḧḨḩ ḪḫḬ ḭḮḯ ḰḱḲ ḳḴḵ ḶḷḸ ḹḺḻ ḼḽḾ ḿṀṁ ṂṃṄ ṅṆṇ ṈṉṊ ṋṌṍ ṎṏṐ ṑṒṓ ṔṕṖ ṗṘṙ ṚṛṜ ṝṞṟ ṠṡṢ ṣṤṥ ṦṧṨ ṩṪṫ ṬṭṮ ṯṰṱ ṲṳṴ ṵṶṷ ṸṹṺ ṻṼṽ Ṿṿ
|
||||
%%
|
||||
%% SmallCaps: \\textsc{abcd efgh ijkl mnop qrst uvwx yzāă ąćĉċ čďđē ĕėęě ĝğġģ ĥħĩī ĭįi̇ı ijĵķĸ ĺļľŀ łńņň ʼnŋōŏ őœŕŗ řśŝş šţťŧ ũūŭů űųŵŷ ÿźżž ſƀɓƃ ƅɔƈɖ ɗƌƍǝ əɛƒɠ ɣƕɩɨ ƙƚƛɯ ɲƞɵơ ƣƥʀƨ ʃƪƫƭ ʈưʊʋ ƴƶʒƹ ƺƻƽƾ ƿǀǁǂ ǃdžljnj ǎǐǒ ǔǖǘǚ ǜǟǡ ǣǥǧǩ ǫǭǯǰ dzǵǹǻ ǽǿḁḃ ḅḇḉḋ ḍḏḑḓ ḕḗḙḛ ḝḟḡḣ ḥḧḩḫ ḭḯḱḳ ḵḷḹḻ ḽḿṁṃ ṅṇṉṋ ṍṏṑṓ ṕṗṙṛ ṝṟṡṣ ṥṧṩṫ ṭṯṱṳ ṵṷṹṻ ṽṿ}
|
||||
%%
|
||||
%% ƀƁƂ ƃƄƅ ƆƇƈ ƉƊƋ ƌƍƎ ƏƐƑ ƒƓƔ ƕƖƗ Ƙƙƚ ƛƜƝ ƞƟƠ ơƢƣ ƤƥƦ ƧƨƩ ƪƫƬ ƭƮƯ ưƱƲ ƳƴƵ ƶƷƸ ƹƺƻ Ƽƽƾ ƿǀǁ ǂǃDŽ DždžLJ LjljNJ NjnjǍ ǎǏǐ ǑǒǓ ǔǕǖ ǗǘǙ ǚǛǜ ǝǞǟ ǠǡǢ ǣǤǥ ǦǧǨ ǩǪǫ ǬǭǮ ǯǰDZ DzdzǴ ǵǶǷ ǸǹǺ ǻǼǽ Ǿǿ
|
||||
%%
|
||||
%% ἀἁἂ ἃἄἅ ἆἇἈ ἉἊἋ ἌἍἎ Ἇἐἑ ἒἓἔ ἕ ἘἙἚ ἛἜἝ ἠ ἡἢἣ ἤἥἦ ἧἨἩ ἪἫἬ ἭἮἯ ἰἱἲ ἳἴἵ ἶἷἸ ἹἺἻ ἼἽἾ Ἷὀὁ ὂὃὄ ὅ ὈὉὊ ὋὌὍ ὐ ὑὒὓ ὔὕὖ ὗὙ Ὓ ὝὟ ὠὡὢ ὣὤὥ ὦὧὨ ὩὪὫ ὬὭὮ Ὧὰά ὲέὴ ήὶί ὸόὺ ύὼώ
|
||||
%%
|
||||
%% ͰͱͲ ͳʹ͵ Ͷͷ ͺͻ ͼͽ; Ϳ ΄ ΅Ά· ΈΉΊ Ό ΎΏΐ ΑΒΓ ΔΕΖ ΗΘΙ ΚΛΜ ΝΞΟ ΠΡ ΣΤΥ ΦΧΨ ΩΪΫ άέή ίΰα βγδ εζη θικ λμν ξοπ ρςσ τυφ χψω ϊϋό ύώϏ ϐϑϒ ϓϔϕ ϖϗϘ ϙϚϛ ϜϝϞ ϟϠϡ ϢϣϤ ϥϦϧ ϨϩϪ ϫϬϭ Ϯϯ
|
||||
%%
|
||||
⌀⌁⌂ ⌃⌄⌅⌆ ⌇⌈⌉⌊ ⌋⌌ ⌍⌎⌏⌐ ⌑⌒⌓ ⌔⌕⌖ ⌗⌘⌙ ⌚⌛⌜ ⌝⌞⌟ ⌠⌡⌢ ⌣⌤⌥ ⌦⌧⌨ 〈〉⌫ ⌬⌭⌮ ⌯⌰⌱ ⌲⌳⌴ ⌵⌶⌷ ⌸⌹⌺ ⌻⌼⌽ ⌾⌿⍀ ⍁⍂⍃ ⍄⍅⍆ ⍇⍈ ⍉⍊ ⍋⍌⍍ ⍎⍏⍐ ⍑⍒⍓ ⍔⍕⍖ ⍗⍘⍙ ⍚⍛⍜
|
||||
⍝⍞⍟ ⍠⍡⍢ ⍣⍤⍥ ⍦⍧⍨ ⍩⍪⍫ ⍬⍭⍮ ⍯⍰⍱ ⍲⍳⍴ ⍵⍶⍷ ⍸⍹⍺ ⍻⍼⍽ ⍾⍿⎀ ⎁⎂⎃ ⎄⎅⎆ ⎇⎈⎉ ⎊⎋⎌ ⎍⎎⎏ ⎐⎑⎒ ⎓⎔⎕ ⎖⎗⎘ ⎙⎚⎛ ⎜⎝⎞ ⎟⎠⎡ ⎢⎣⎤ ⎥⎦⎧ ⎨⎩⎪ ⎫⎬⎭ ⎮⎯⎰ ⎱⎲⎳ ⎴⎵⎶ ⎷⎸⎹ ⎺⎻⎼
|
||||
⎽⎾ ⎿⏀⏁ ⏂⏃⏄ ⏅⏆⏇ ⏈⏉⏊ ⏋⏌⏍ ⏎⏏⏐ ⏑⏒⏓ ⏔⏕⏖ ⏗⏘⏙ ⏚⏛⏜ ⏝⏞⏟ ⏠⏡⏢ ⏣⏤⏥ ⏦⏧⏨ ⏩⏪⏫ ⏬⏭⏮ ⏯⏰⏱ ⏲⏳⏴ ⏵⏶⏷ ⏸⏹⏺ ⏻⏼⏽ ⏾⏿
|
||||
|
||||
}
|
||||
END
|
||||
|
||||
TEX_FOOTER = "\\end{document}"
|
||||
|
||||
class << self
|
||||
|
||||
def create_comparison_pdf(pdf_file, font_families, base_font_family: "DeGruyter")
|
||||
|
||||
base_fonts = Font.where(:family => base_font_family).collect{|font| font.family_fonts}.flatten.uniq.sort_by{|font|
|
||||
style_index = 100
|
||||
if font.sub_family == "Regular"
|
||||
style_index = 0
|
||||
elsif font.sub_family == "Bold"
|
||||
style_index = 2
|
||||
elsif font.sub_family == "Italic"
|
||||
style_index = 1
|
||||
elsif font.sub_family == "Bold Italic"
|
||||
style_index = 3
|
||||
end
|
||||
|
||||
[font_families.index(font.family), style_index]
|
||||
}
|
||||
|
||||
|
||||
fonts = Font.where(:family => font_families).collect{|font| font.family_fonts}.flatten.uniq.sort_by{|font|
|
||||
style_index = 100
|
||||
if font.sub_family == "Regular"
|
||||
style_index = 0
|
||||
elsif font.sub_family == "Bold"
|
||||
style_index = 2
|
||||
elsif font.sub_family == "Italic"
|
||||
style_index = 1
|
||||
elsif font.sub_family == "Bold Italic"
|
||||
style_index = 3
|
||||
end
|
||||
|
||||
[font_families.index(font.family), style_index]
|
||||
}
|
||||
File.open("#{File.dirname(__FILE__)}/test.css", 'w+'){|file|
|
||||
(fonts + base_fonts).each_with_index{|font, index|
|
||||
|
||||
file.puts "@font-face {"
|
||||
file.puts " font-family: '#{font.family}';"
|
||||
file.puts " src: url(data:font/#{File.extname(font.file_locations.first) == '.otf' ? 'opentype' : 'truetype'};charset=utf-8;base64,#{Base64.encode64(File.read(font.file_locations.first)).gsub(/\s+/, "")});"
|
||||
if font.sub_family == "Regular"
|
||||
elsif font.sub_family == "Bold"
|
||||
file.puts " font-weight: bold;"
|
||||
elsif font.sub_family == "Italic"
|
||||
file.puts " font-style: italic;"
|
||||
elsif font.sub_family == "Bold Italic"
|
||||
file.puts " font-weight: bold;"
|
||||
file.puts " font-style: italic;"
|
||||
end
|
||||
file.puts "}"
|
||||
|
||||
|
||||
file.puts
|
||||
file.puts ".font-#{font.id} {"
|
||||
file.puts " "
|
||||
file.puts " font-family: '#{font.family}';"
|
||||
if font.sub_family == "Regular"
|
||||
elsif font.sub_family == "Bold"
|
||||
file.puts " font-weight: bold;"
|
||||
elsif font.sub_family == "Italic"
|
||||
file.puts " font-style: italic;"
|
||||
elsif font.sub_family == "Bold Italic"
|
||||
file.puts " font-weight: bold;"
|
||||
file.puts " font-style: italic;"
|
||||
end
|
||||
file.puts " font-size: 12pt;"
|
||||
file.puts "}"
|
||||
file.puts ".font-comparison {"
|
||||
file.puts " clear: both;"
|
||||
file.puts " "
|
||||
file.puts "}"
|
||||
file.puts ".page-break {"
|
||||
file.puts " page-break-after: always;"
|
||||
file.puts " "
|
||||
file.puts "}"
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
builder = Nokogiri::HTML::Builder.new do |doc|
|
||||
doc.html {
|
||||
doc.body {
|
||||
fonts.each_with_index{|font, index|
|
||||
|
||||
_hash = font.compare(base_font_family)
|
||||
|
||||
doc.div(class: 'font-comparison') {
|
||||
doc.div(class: 'left' , style: "float:left; width:45%;") {
|
||||
doc.div(class: 'font_id') {
|
||||
doc.text "ID: #{font.id}"
|
||||
}
|
||||
|
||||
doc.div(class: 'font_name') {
|
||||
doc.text "Name: #{font.family}"
|
||||
}
|
||||
|
||||
doc.div(class: 'font_name') {
|
||||
doc.text "Stil: #{font.sub_family}"
|
||||
}
|
||||
doc.div(class: 'font_information') {
|
||||
doc.text "% Glyphen: #{_hash[:percentage_glyphs]}"
|
||||
}
|
||||
|
||||
doc.div(class: 'font_information') {
|
||||
doc.text "% Features: #{_hash[:percentage_features]}"
|
||||
}
|
||||
|
||||
doc.div(class: 'font_information') {
|
||||
doc.text "Anzahl fehlende Gylphen: #{_hash[:missing_glyph_code_points_count]}"
|
||||
}
|
||||
|
||||
doc.div(class: 'font_information') {
|
||||
doc.text "Anzahl fehlende Features: #{_hash[:missing_features_count]}"
|
||||
}
|
||||
|
||||
doc.div(class: "font-#{font.id}") {
|
||||
doc.text font.replace_missing_glyphs(BLINDTEXT)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
compare_font = font.comparison_font(base_font_family)
|
||||
doc.div(class: 'right', style: "float:right; width:45%;") {
|
||||
if compare_font
|
||||
|
||||
doc.div(class: 'font_id') {
|
||||
doc.text "ID: #{compare_font.id}"
|
||||
}
|
||||
|
||||
doc.div(class: 'font_name') {
|
||||
doc.text "Name: #{compare_font.family}"
|
||||
}
|
||||
|
||||
doc.div(class: 'font_name') {
|
||||
doc.text "Stil: #{compare_font.sub_family}"
|
||||
}
|
||||
doc.div(class: 'font_information') {
|
||||
doc.text " "
|
||||
}
|
||||
|
||||
doc.div(class: 'font_information') {
|
||||
doc.text " "
|
||||
}
|
||||
|
||||
doc.div(class: 'font_information') {
|
||||
doc.text " "
|
||||
}
|
||||
|
||||
doc.div(class: 'font_information') {
|
||||
doc.text " "
|
||||
}
|
||||
|
||||
doc.div(class: "font-#{compare_font.id}") {
|
||||
doc.text compare_font.replace_missing_glyphs(BLINDTEXT)
|
||||
}
|
||||
end
|
||||
}
|
||||
|
||||
}
|
||||
doc.div(class: 'page-break') {
|
||||
doc.text " "
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
kit = PDFKit.new(builder.to_html, :page_size => 'Letter')
|
||||
kit.stylesheets << "#{File.dirname(__FILE__)}/test.css"
|
||||
file = kit.to_file(pdf_file)
|
||||
|
||||
|
||||
end
|
||||
|
||||
def create_font_test_pdf(pdf_file, regular_font_location)
|
||||
Dir.mktmpdir do |dir|
|
||||
|
||||
FileUtils.mkdir_p("#{dir}/fonts/1/")
|
||||
FileUtils.cp(regular_font_location, "#{dir}/fonts/1/#{File.basename(regular_font_location).gsub(/[\[\]]/,'_')}")
|
||||
|
||||
File.open("#{dir}/main.tex",'w+'){|file|
|
||||
file.puts TEX_HEADER
|
||||
file.puts "\\XeTeXtracingfonts=1"
|
||||
file.puts "\\newfontfamily{\\nf}[Path=./fonts/1/]{NewFont}"
|
||||
file.puts "\\nf"
|
||||
file.puts "ΔΕΖ"
|
||||
file.puts
|
||||
file.puts "\\blindtext"
|
||||
file.puts TEX_FOOTER
|
||||
}
|
||||
#puts File.read("#{dir}/main.tex")
|
||||
puts `cd #{dir}; /usr/local/texlive/2015/bin/x86_64-linux/xelatex --interaction=batchmode main`
|
||||
FileUtils.cp("#{dir}/main.pdf", pdf_file)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
def create_fonts_tex_pdf(pdf_file, font_families, base_font_family, type: :blind )
|
||||
regular_base_font = Font.where(family: base_font_family).first.regular_font
|
||||
bold_base_font = Font.where(family: base_font_family).first.bold_font
|
||||
italic_base_font = Font.where(family: base_font_family).first.italic_font
|
||||
bold_italic_base_font = Font.where(family: base_font_family).first.bold_italic_font
|
||||
|
||||
|
||||
Dir.mktmpdir do |dir|
|
||||
base_font_spec = regular_base_font.fontspec("#{dir}/fonts/#{regular_base_font.id}/")
|
||||
FileUtils.mkdir_p("#{dir}/fonts/#{regular_base_font.id}")
|
||||
FileUtils.cp(regular_base_font&.file_locations&.first, "#{dir}/fonts/#{regular_base_font.id}/#{File.basename(regular_base_font&.file_locations&.first).gsub(/[\[\]]/,'_')}") if regular_base_font&.file_locations&.first
|
||||
FileUtils.cp(bold_base_font&.file_locations&.first, "#{dir}/fonts/#{regular_base_font.id}/#{File.basename(bold_base_font&.file_locations&.first).gsub(/[\[\]]/,'_')}") if bold_base_font&.file_locations&.first
|
||||
FileUtils.cp(italic_base_font&.file_locations&.first, "#{dir}/fonts/#{regular_base_font.id}/#{File.basename(italic_base_font&.file_locations&.first).gsub(/[\[\]]/,'_')}") if italic_base_font&.file_locations&.first
|
||||
FileUtils.cp(bold_italic_base_font&.file_locations&.first, "#{dir}/fonts/#{regular_base_font.id}/#{File.basename(bold_italic_base_font&.file_locations&.first).gsub(/[\[\]]/,'_')}") if bold_italic_base_font&.file_locations&.first
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
File.open("#{dir}/main.tex",'w+'){|file|
|
||||
file.puts TEX_HEADER
|
||||
|
||||
font_families.each{|font_family|
|
||||
|
||||
regular_font = Font.where(family: font_family).first.regular_font
|
||||
bold_font = Font.where(family: font_family).first.bold_font
|
||||
italic_font = Font.where(family: font_family).first.italic_font
|
||||
bold_italic_font = Font.where(family: font_family).first.bold_italic_font
|
||||
|
||||
next unless regular_font
|
||||
|
||||
_regular_hash = {}
|
||||
_bold_hash = {}
|
||||
_italic_hash = {}
|
||||
_bold_italic_hash = {}
|
||||
|
||||
_regular_hash = regular_font.compare(base_font_family) if regular_font
|
||||
_bold_hash = bold_font.compare(base_font_family) if bold_font
|
||||
_italic_hash = italic_font.compare(base_font_family) if italic_font
|
||||
_bold_italic_hash = bold_italic_font.compare(base_font_family) if bold_italic_font
|
||||
|
||||
|
||||
|
||||
font_spec = regular_font.fontspec("#{dir}/fonts/#{regular_font.id}/")
|
||||
FileUtils.mkdir_p("#{dir}/fonts/#{regular_font.id}")
|
||||
|
||||
FileUtils.cp(regular_font&.file_locations&.first, "#{dir}/fonts/#{regular_font.id}/#{File.basename(regular_font&.file_locations&.first).gsub(/[\[\]]/,'_')}") if regular_font&.file_locations&.first and File.exist?(regular_font&.file_locations&.first)
|
||||
FileUtils.cp(bold_font&.file_locations&.first, "#{dir}/fonts/#{regular_font.id}/#{File.basename(bold_font&.file_locations&.first).gsub(/[\[\]]/,'_')}") if bold_font&.file_locations&.first and File.exist?(bold_font&.file_locations&.first)
|
||||
FileUtils.cp(italic_font&.file_locations&.first, "#{dir}/fonts/#{regular_font.id}/#{File.basename(italic_font&.file_locations&.first).gsub(/[\[\]]/,'_')}") if italic_font&.file_locations&.first and File.exist?(italic_font&.file_locations&.first)
|
||||
FileUtils.cp(bold_italic_font&.file_locations&.first, "#{dir}/fonts/#{regular_font.id}/#{File.basename(bold_italic_font&.file_locations&.first).gsub(/[\[\]]/,'_')}") if bold_italic_font&.file_locations&.first and File.exist?(bold_italic_font&.file_locations&.first)
|
||||
|
||||
#[regular_font, bold_font, italic_font, bold_italic_font].each{|font|
|
||||
|
||||
if type == :blind
|
||||
|
||||
file.puts "#{font_spec}
|
||||
Fontname: #{regular_font.family} #{regular_font.sub_family} #{regular_font.id}\\hfill\\break\\vskip1mm
|
||||
\\vbox to 16.2mm {%
|
||||
Glyphen: #{_regular_hash[:percentage_glyphs].round(2)}\\% (#{_regular_hash[:missing_glyph_code_points_count]} fehlen) Features: #{_regular_hash[:percentage_features].round(2)}\\% (#{_regular_hash[:missing_features_count]} fehlen)\\hfill\\break
|
||||
Schnittmenge Features: #{(regular_font.features.pluck(:short_name) & regular_base_font.features.pluck(:short_name)).join(", ")}}
|
||||
|
||||
Schriftbeispiele\\hfill\\break\\noindent
|
||||
|
||||
\\blindtext\\vfill\\break
|
||||
#{base_font_spec}
|
||||
Fontname: #{regular_base_font.family} #{regular_base_font.sub_family}\\hfill\\break\\vskip1mm
|
||||
\\vbox to 16.2mm {vorhandene Features: #{regular_base_font.features.pluck(:short_name).join(", ")}}
|
||||
|
||||
Schriftbeispiele\\hfill\\break\\noindent
|
||||
|
||||
\\blindtext
|
||||
\\vfill\\break" if regular_font
|
||||
file.puts "#{font_spec}
|
||||
Fontname: #{italic_font.family} #{italic_font.sub_family} #{italic_font.id}\\hfill\\break\\vskip1mm
|
||||
\\vbox to 16.2mm {%
|
||||
Glyphen: #{_italic_hash[:percentage_glyphs].round(2)}\\% (#{_italic_hash[:missing_glyph_code_points_count]} fehlen) Features: #{_italic_hash[:percentage_features].round(2)}\\% (#{_italic_hash[:missing_features_count]} fehlen)\\hfill\\break
|
||||
Schnittmenge Features: #{(italic_font.features.pluck(:short_name) & italic_base_font.features.pluck(:short_name)).join(", ")}}
|
||||
|
||||
Schriftbeispiele\\hfill\\break\\noindent
|
||||
|
||||
{\\noindent\\textit{\\blindtext}}
|
||||
|
||||
\\vfill\\break
|
||||
#{base_font_spec}
|
||||
Fontname: #{italic_base_font.family} #{italic_base_font.sub_family}\\hfill\\break\\vskip1mm
|
||||
\\vbox to 16.2mm {vorhandene Features: #{italic_base_font.features.pluck(:short_name).join(", ")}}
|
||||
|
||||
Schriftbeispiele\\hfill\\break\\noindent
|
||||
|
||||
{\\noindent\\textit{\\blindtext}}
|
||||
\\vfill\\break" if italic_font
|
||||
file.puts "#{font_spec}
|
||||
Fontname: #{bold_font.family} #{bold_font.sub_family} #{bold_font.id}\\hfill\\break\\vskip1mm
|
||||
\\vbox to 16.2mm {%
|
||||
Glyphen: #{_bold_hash[:percentage_glyphs].round(2)}\\% (#{_bold_hash[:missing_glyph_code_points_count]} fehlen) Features: #{_bold_hash[:percentage_features].round(2)}\\% (#{_bold_hash[:missing_features_count]} fehlen)\\hfill\\break
|
||||
Schnittmenge Features: #{(bold_font.features.pluck(:short_name) & bold_base_font.features.pluck(:short_name)).join(", ")}}
|
||||
|
||||
Schriftbeispiele\\hfill\\break\\noindent
|
||||
|
||||
{\\noindent
|
||||
\\textbf{\\blindtext}
|
||||
}
|
||||
|
||||
\\vfill\\break
|
||||
#{base_font_spec}
|
||||
Fontname: #{bold_base_font.family} #{bold_base_font.sub_family}\\hfill\\break\\vskip1mm
|
||||
\\vbox to 16.2mm {vorhandene Features: #{bold_base_font.features.pluck(:short_name).join(", ")}}
|
||||
|
||||
Schriftbeispiele\\hfill\\break\\noindent
|
||||
|
||||
{\\noindent
|
||||
\\textbf{\\blindtext}
|
||||
}
|
||||
|
||||
\\vfill\\break" if bold_font
|
||||
file.puts "#{font_spec}
|
||||
Fontname: #{bold_italic_font.family} #{bold_italic_font.sub_family} #{bold_italic_font.id}\\hfill\\break\\vskip1mm
|
||||
\\vbox to 16.2mm {%
|
||||
Glyphen: #{_bold_italic_hash[:percentage_glyphs].round(2)}\\% (#{_bold_italic_hash[:missing_glyph_code_points_count]} fehlen) Features: #{_bold_italic_hash[:percentage_features].round(2)}\\% (#{_bold_italic_hash[:missing_features_count]} fehlen)\\hfill\\break
|
||||
Schnittmenge Features: #{(bold_italic_font.features.pluck(:short_name) & bold_italic_base_font.features.pluck(:short_name)).join(", ")}}
|
||||
|
||||
Schriftbeispiele\\hfill\\break\\noindent
|
||||
|
||||
{\\bf\\noindent
|
||||
\\textit{
|
||||
\\blindtext
|
||||
|
||||
}
|
||||
}\\vfill\\break
|
||||
#{base_font_spec}
|
||||
Fontname: #{bold_italic_base_font.family} #{bold_italic_base_font.sub_family}\\hfill\\break\\vskip1mm
|
||||
\\vbox to 16.2mm {vorhandene Features: #{bold_italic_base_font.features.pluck(:short_name).join(", ")}}
|
||||
|
||||
Schriftbeispiele\\hfill\\break\\noindent
|
||||
|
||||
{\\bf\\noindent
|
||||
\\textit{
|
||||
\\blindtext
|
||||
|
||||
}
|
||||
}\\vfill\\break
|
||||
%
|
||||
" if bold_italic_font
|
||||
elsif type == :numbers
|
||||
|
||||
file.puts "#{base_font_spec}#{regular_font.family}\\hfill\\break"
|
||||
|
||||
file.puts "Fontname: #{regular_base_font.family} #{regular_base_font.sub_family}\\hfill\\break
|
||||
Fontname: #{regular_font.family} #{regular_font.sub_family} #{regular_font.id}\\hfill\\break
|
||||
\\noindent{1234567890}\\hfill\\break
|
||||
#{font_spec}
|
||||
\\noindent{1234567890}\\hfill\\break
|
||||
#{base_font_spec}" if regular_font
|
||||
|
||||
|
||||
file.puts "#{base_font_spec}
|
||||
Fontname: #{italic_base_font.family} #{italic_base_font.sub_family}\\hfill\\break
|
||||
Fontname: #{italic_font.family} #{italic_font.sub_family} #{italic_font.id}\\hfill\\break
|
||||
{\\noindent\\textit{1234567890}}\\hfill\\break
|
||||
#{font_spec}
|
||||
{\\noindent\\textit{1234567890}}\\hfill\\break
|
||||
#{base_font_spec}" if italic_font
|
||||
|
||||
|
||||
file.puts "#{base_font_spec}
|
||||
Fontname: #{bold_base_font.family} #{bold_base_font.sub_family}\\hfill\\break
|
||||
Fontname: #{bold_font.family} #{bold_font.sub_family} #{bold_font.id}\\hfill\\break
|
||||
{\\noindent\\textbf{1234567890}}\\hfill\\break
|
||||
#{font_spec}
|
||||
{\\noindent\\textbf{1234567890}}\\hfill\\break
|
||||
#{base_font_spec}" if bold_font
|
||||
|
||||
file.puts "#{base_font_spec}
|
||||
Fontname: #{bold_italic_base_font.family} #{bold_italic_base_font.sub_family}\\hfill\\break
|
||||
Fontname: #{bold_italic_font.family} #{bold_italic_font.sub_family} #{bold_italic_font.id}\\hfill\\break
|
||||
{\\bf\\noindent\\textit{1234567890}}\\hfill\\break
|
||||
#{font_spec}
|
||||
{\\bf\\noindent\\textit{1234567890}}\\hfill\\break
|
||||
#{base_font_spec}" if bold_italic_font
|
||||
file.puts "\\vfill\\break"
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
}
|
||||
file.puts TEX_FOOTER
|
||||
}
|
||||
puts `cd #{dir}; /usr/local/texlive/2015/bin/x86_64-linux/xelatex --interaction=batchmode main`
|
||||
FileUtils.cp("#{dir}/main.pdf", pdf_file)
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -0,0 +1,83 @@
|
||||
SplineFontDB: 3.2
|
||||
FontName: Untitled1
|
||||
FullName: Untitled1
|
||||
FamilyName: Untitled1
|
||||
Weight: Regular
|
||||
Copyright: Copyright (c) 2020, jasch
|
||||
UComments: "2020-11-27: Created with FontForge (http://fontforge.org)"
|
||||
Version: 001.000
|
||||
ItalicAngle: 0
|
||||
UnderlinePosition: -100
|
||||
UnderlineWidth: 50
|
||||
Ascent: 800
|
||||
Descent: 200
|
||||
InvalidEm: 0
|
||||
LayerCount: 2
|
||||
Layer: 0 0 "Zur+APwA-ck" 1
|
||||
Layer: 1 0 "Zeichen" 0
|
||||
XUID: [1021 672 1102542148 338422]
|
||||
StyleMap: 0x0000
|
||||
FSType: 0
|
||||
OS2Version: 0
|
||||
OS2_WeightWidthSlopeOnly: 0
|
||||
OS2_UseTypoMetrics: 1
|
||||
CreationTime: 1606489963
|
||||
ModificationTime: 1606490408
|
||||
OS2TypoAscent: 0
|
||||
OS2TypoAOffset: 1
|
||||
OS2TypoDescent: 0
|
||||
OS2TypoDOffset: 1
|
||||
OS2TypoLinegap: 90
|
||||
OS2WinAscent: 0
|
||||
OS2WinAOffset: 1
|
||||
OS2WinDescent: 0
|
||||
OS2WinDOffset: 1
|
||||
HheadAscent: 0
|
||||
HheadAOffset: 1
|
||||
HheadDescent: 0
|
||||
HheadDOffset: 1
|
||||
DEI: 91125
|
||||
Encoding: UnicodeBmp
|
||||
UnicodeInterp: none
|
||||
NameList: AGL For New Fonts
|
||||
DisplaySize: -48
|
||||
AntiAlias: 1
|
||||
FitToEm: 0
|
||||
WinInfo: 62662 38 14
|
||||
BeginChars: 65536 2
|
||||
|
||||
StartChar: uniF5F0
|
||||
Encoding: 62960 62960 0
|
||||
Width: 1000
|
||||
VWidth: 0
|
||||
HStem: 208 81<0 1000>
|
||||
LayerCount: 2
|
||||
Fore
|
||||
SplineSet
|
||||
0 289 m 5
|
||||
1000 289 l 5
|
||||
1000 208 l 5
|
||||
0 208 l 5
|
||||
0 289 l 5
|
||||
EndSplineSet
|
||||
Validated: 1
|
||||
EndChar
|
||||
|
||||
StartChar: uniF5F1
|
||||
Encoding: 62961 62961 1
|
||||
Width: 1000
|
||||
VWidth: 0
|
||||
HStem: 208 141<0 1000>
|
||||
LayerCount: 2
|
||||
Fore
|
||||
SplineSet
|
||||
0 349 m 5
|
||||
1000 349 l 5
|
||||
1000 208 l 1
|
||||
0 208 l 1
|
||||
0 349 l 5
|
||||
EndSplineSet
|
||||
Validated: 1
|
||||
EndChar
|
||||
EndChars
|
||||
EndSplineFont
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,937 @@
|
||||
\documentclass[english,ngerman]{book}%,openany
|
||||
|
||||
|
||||
\usepackage[LGR]{fontenc}
|
||||
\ifx\directlua\undefined\ifx\XeTeXcharclass\undefined
|
||||
\usepackage[utf8]{inputenc}
|
||||
\else\RequirePackage[no-math]{fontspec}[2017/03/31]\fi %xetex engine
|
||||
\else\RequirePackage[no-math]{fontspec}[2017/03/31]\fi %luatex engine
|
||||
%\RequirePackage{color}
|
||||
\usepackage{colortbl}
|
||||
|
||||
\usepackage[medium]{dgruyter}
|
||||
|
||||
%\usepackage[bottom,multiple]{footmisc}
|
||||
|
||||
|
||||
|
||||
\setmainfont{___REGULAR_SERIF_FONT___}[
|
||||
Path = ___FONT_PATH___,
|
||||
BoldFont= ___BOLD_SERIF_FONT___,
|
||||
ItalicFont = ___ITALIC_SERIF_FONT___,
|
||||
BoldItalicFont = ___BOLD_ITALIC_SERIF_FONT___]
|
||||
|
||||
\setsansfont{___REGULAR_SANS_FONT___}[
|
||||
Path = ___FONT_PATH___,
|
||||
BoldFont= ___BOLD_SANS_FONT___,
|
||||
ItalicFont = ___ITALIC_SANS_FONT___,
|
||||
BoldItalicFont = ___BOLD_ITALIC_SANS_FONT___]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
%\usepackage{lingmacros}
|
||||
%\usepackage{gb4e}\noautomath
|
||||
%\usepackage{linguex}
|
||||
%\usepackage{expex}
|
||||
\usepackage{dcolumn}
|
||||
|
||||
\usepackage{tipa}
|
||||
|
||||
\usepackage{qtree}
|
||||
|
||||
% %\usepackage{bigfoot}
|
||||
|
||||
% %\def\thepart{\Alph{part}}
|
||||
|
||||
\theoremstyle{dgdef}
|
||||
\newtheorem{definition}{Definition}%[chapter]
|
||||
\theoremstyle{dgthm}
|
||||
\newtheorem{theorem}{Theorem}%[chapter]
|
||||
\newtheorem{corollary}[theorem]{Corollary}
|
||||
\newtheorem{lemma}[theorem]{Lemma}
|
||||
|
||||
% %\setcitestyle{numbers}
|
||||
|
||||
\author{Max Mustermann\and Arno Nym}
|
||||
\title{Testdokument zum Test von verschiedenen Schriftarten}
|
||||
|
||||
% %RequirePackage{natbib}\setcitestyle{numbers}
|
||||
|
||||
% %\usepackage{biblatex}
|
||||
\usepackage{listings}
|
||||
% %\setmonofont[]{Inconsolatazi4-Regular.otf}
|
||||
|
||||
% %\usepackage{../../../0allgemein/tex/letexedn/letexedn}
|
||||
% %\usepackage{../../0allgemein/satz/DegWarnu}
|
||||
|
||||
% \RequirePackage{framed}
|
||||
% \def\FrameHeightAdjust{\topskip}
|
||||
% \FrameSep2mm
|
||||
% \RequirePackage[noadjust]{marginnote}
|
||||
% \let\marginnoteleftadjust\FrameSep
|
||||
% \let\marginnoterightadjust\FrameSep
|
||||
% \makeatletter
|
||||
% \RequirePackage{DUMMY-ORDNER/overprint}
|
||||
% \newenvironment{blau}
|
||||
% {\marginparsep2mm\relax
|
||||
% \def\FrameCommand{\fboxsep=\FrameSep\colorbox[cmyk]{0.5,0,0,0}}%
|
||||
% \MakeFramed{\advance\hsize-\width\FrameRestore}%
|
||||
% \sffamily\mathversion{ss}\small
|
||||
% \parindent\z@
|
||||
% \parfillskip2em\@plus1.0fil\relax
|
||||
% \leavevmode\marginnote{\leavevmode\smash{\lower7\p@\hbox{\includegraphics[height=13pt,clip]{DG_attention}}}}%
|
||||
% \overprint
|
||||
% \ignorespaces}
|
||||
% {\knockout
|
||||
% \par\ifdim\lastskip=\belowdisplayskip\vskip-\lastskip\fi\nobreak
|
||||
% \endMakeFramed\aftergroup\@afterbox}
|
||||
|
||||
% \makeatother
|
||||
|
||||
|
||||
\newcommand{\blindtext}{%
|
||||
\noindent{}
|
||||
|
||||
Zwei flinke Boxer jagen die quirlige Eva und ihren Mops durch Sylt. Franz jagt im komplett verwahrlosten Taxi quer durch
|
||||
Bayern. Zwölf Boxkämpfer jagen Viktor quer über den großen Sylter Deich. Vogel Quax zwickt Johnys Pferd Bim. Sylvia wagt quick
|
||||
den Jux bei Pforzheim. Polyfon zwitschernd aßen Mäxchens Vögel Rüben, Joghurt und Quark. ,,Fix, Schwyz!'' quäkt Jürgen blöd vom
|
||||
Paß. Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich. Falsches Üben von Xylophonmusik quält jeden größeren
|
||||
Zwerg. Heizölrückstoßabdämpfung.
|
||||
|
||||
aäb cde fgh ijk lmn oöp qrsß tuü vwx yz AÄBC DEF GHI JKL MNO ÖPQ RST UÜV WXYZ !"§ \$\%\& /() =?* ' \# \symbol{"7E} ²³ @`´ ©«» ¼ \{\} € - -- ---
|
||||
|
||||
Ligaturen: ff, fi, fl, ft, ffi, ffl, fk, fj, fh, fb, fz, ll, st, ch, ck, ct, th, tt, tz, kk, Qu, ſi, ſſ, ſt, ſch
|
||||
|
||||
Λορεμ ιπσθμ δολορ σιτ αμετ, νοvθμ φαβελλασ πετεντιθμ vελ νε, ατ νισλ σονετ οπορτερε εθμ. Αλιι δοcτθσ μει ιδ, νο αθτεμ αθδιρε ιντερεσσετ μελ, δοcενδι cομμθνε οπορτεατ τε cθμ.
|
||||
|
||||
Лорем ипсум долор сит амет, пер цлита поссит ех, ат мунере фабулас петентиум сит. Иус цу цибо саперет сцрипсерит, нец виси муциус лабитур ид. Ет хис нонумес нолуиссе дигниссим.
|
||||
|
||||
ÀÁ ÃÄÅ ÆÇÈ ÉÊË ÌÍÎ ÏÐÑ ÒÓÔ ÕÖ× ØÙÚ ÛÜÝ Þßà áâã äåæ çèé êëì íîï ðñò óôõ ö÷ø ùúû üýþ ÿ Āāà 㥹 ĆćĈ ĉĊċ ČčĎ ďĐđ ĒēĔ ĕĖė ĘęĚ ěĜĝ ĞğĠ ġĢģ ĤĥĦ ħĨĩ ĪīĬ ĭĮį İıIJ ijĴĵ Ķķĸ ĹĺĻ ļĽľ ĿŀŁ łŃń ŅņŇ ňʼnŊ ŋŌō ŎŏŐ őŒœ ŔŕŖ ŗŘř ŚśŜ ŝŞş ŠšŢ ţŤť ŦŧŨ ũŪū ŬŭŮ ůŰű ŲųŴ ŵŶŷ ŸŹź ŻżŽ žſ ḀḁḂ ḃḄḅ ḆḇḈ ḉḊḋ ḌḍḎ ḏḐḑ ḒḓḔ ḕḖḗ ḘḙḚ ḛḜḝ ḞḟḠ ḡḢḣ ḤḥḦ ḧḨḩ ḪḫḬ ḭḮḯ ḰḱḲ ḳḴḵ ḶḷḸ ḹḺḻ ḼḽḾ ḿṀṁ ṂṃṄ ṅṆṇ ṈṉṊ ṋṌṍ ṎṏṐ ṑṒṓ ṔṕṖ ṗṘṙ ṚṛṜ ṝṞṟ ṠṡṢ ṣṤṥ ṦṧṨ ṩṪṫ ṬṭṮ ṯṰṱ ṲṳṴ ṵṶṷ ṸṹṺ ṻṼṽ Ṿṿ
|
||||
|
||||
abcd efgh ijkl mnop qrst uvwx yzāă ąćĉċ čďđē ĕėęě ĝğġģ ĥħĩī ĭįi̇ı ijĵķĸ ĺļľŀ łńņň ʼnŋōŏ őœŕŗ řśŝş šţťŧ ũūŭů űųŵŷ ÿźżž ſƀɓƃ ƅɔƈɖ ɗƌƍǝ əɛƒɠ ɣƕɩɨ ƙƚƛɯ ɲƞɵơ ƣƥʀƨ ʃƪƫƭ ʈưʊʋ ƴƶʒƹ ƺƻƽƾ ƿǀǁǂ ǃdžljnj ǎǐǒ ǔǖǘǚ ǜǟǡ ǣǥǧǩ ǫǭǯǰ dzǵǹǻ ǽǿḁḃ ḅḇḉḋ ḍḏḑḓ ḕḗḙḛ ḝḟḡḣ ḥḧḩḫ ḭḯḱḳ ḵḷḹḻ ḽḿṁṃ ṅṇṉṋ ṍṏṑṓ ṕṗṙṛ ṝṟṡṣ ṥṧṩṫ ṭṯṱṳ ṵṷṹṻ ṽṿ
|
||||
|
||||
ƀƁƂ ƃƄƅ ƆƇƈ ƉƊƋ ƌƍƎ ƏƐƑ ƒƓƔ ƕƖƗ Ƙƙƚ ƛƜƝ ƞƟƠ ơƢƣ ƤƥƦ ƧƨƩ ƪƫƬ ƭƮƯ ưƱƲ ƳƴƵ ƶƷƸ ƹƺƻ Ƽƽƾ ƿǀǁ ǂǃDŽ DždžLJ LjljNJ NjnjǍ ǎǏǐ ǑǒǓ ǔǕǖ ǗǘǙ ǚǛǜ ǝǞǟ ǠǡǢ ǣǤǥ ǦǧǨ ǩǪǫ ǬǭǮ ǯǰDZ DzdzǴ ǵǶǷ ǸǹǺ ǻǼǽ Ǿǿ
|
||||
|
||||
ἀἁἂ ἃἄἅ ἆἇἈ ἉἊἋ ἌἍἎ Ἇἐἑ ἒἓἔ ἕ ἘἙἚ ἛἜἝ ἠ ἡἢἣ ἤἥἦ ἧἨἩ ἪἫἬ ἭἮἯ ἰἱἲ ἳἴἵ ἶἷἸ ἹἺἻ ἼἽἾ Ἷὀὁ ὂὃὄ ὅ ὈὉὊ ὋὌὍ ὐ ὑὒὓ ὔὕὖ ὗὙ Ὓ ὝὟ ὠὡὢ ὣὤὥ ὦὧὨ ὩὪὫ ὬὭὮ Ὧὰά ὲέὴ ήὶί ὸόὺ ύὼώ
|
||||
|
||||
ͰͱͲ ͳʹ͵ Ͷͷ ͺͻ ͼͽ; Ϳ ΄ ΅Ά· ΈΉΊ Ό ΎΏΐ ΑΒΓ ΔΕΖ ΗΘΙ ΚΛΜ ΝΞΟ ΠΡ ΣΤΥ ΦΧΨ ΩΪΫ άέή ίΰα βγδ εζη θικ λμν ξοπ ρςσ τυφ χψω ϊϋό ύώϏ ϐϑϒ ϓϔϕ ϖϗϘ ϙϚϛ ϜϝϞ ϟϠϡ ϢϣϤ ϥϦϧ ϨϩϪ ϫϬϭ Ϯϯ
|
||||
|
||||
⌀⌁⌂ ⌃⌄⌅⌆ ⌇⌈⌉⌊ ⌋⌌ ⌍⌎⌏⌐ ⌑⌒⌓ ⌔⌕⌖ ⌗⌘⌙ ⌚⌛⌜ ⌝⌞⌟ ⌠⌡⌢ ⌣⌤⌥ ⌦⌧⌨ 〈〉⌫ ⌬⌭⌮ ⌯⌰⌱ ⌲⌳⌴ ⌵⌶⌷ ⌸⌹⌺ ⌻⌼⌽ ⌾⌿⍀ ⍁⍂⍃ ⍄⍅⍆ ⍇⍈ ⍉⍊ ⍋⍌⍍ ⍎⍏⍐ ⍑⍒⍓ ⍔⍕⍖ ⍗⍘⍙ ⍚⍛⍜
|
||||
⍝⍞⍟ ⍠⍡⍢ ⍣⍤⍥ ⍦⍧⍨ ⍩⍪⍫ ⍬⍭⍮ ⍯⍰⍱ ⍲⍳⍴ ⍵⍶⍷ ⍸⍹⍺ ⍻⍼⍽ ⍾⍿⎀ ⎁⎂⎃ ⎄⎅⎆ ⎇⎈⎉ ⎊⎋⎌ ⎍⎎⎏ ⎐⎑⎒ ⎓⎔⎕ ⎖⎗⎘ ⎙⎚⎛ ⎜⎝⎞ ⎟⎠⎡ ⎢⎣⎤ ⎥⎦⎧ ⎨⎩⎪ ⎫⎬⎭ ⎮⎯⎰ ⎱⎲⎳ ⎴⎵⎶ ⎷⎸⎹ ⎺⎻⎼
|
||||
⎽⎾ ⎿⏀⏁ ⏂⏃⏄ ⏅⏆⏇ ⏈⏉⏊ ⏋⏌⏍ ⏎⏏⏐ ⏑⏒⏓ ⏔⏕⏖ ⏗⏘⏙ ⏚⏛⏜ ⏝⏞⏟ ⏠⏡⏢ ⏣⏤⏥ ⏦⏧⏨ ⏩⏪⏫ ⏬⏭⏮ ⏯⏰⏱ ⏲⏳⏴ ⏵⏶⏷ ⏸⏹⏺ ⏻⏼⏽ ⏾⏿
|
||||
}
|
||||
|
||||
|
||||
\newcommand{\kurzerblindtext}{%
|
||||
\noindent{}Zwei flinke Boxer jagen die quirlige Eva und ihren Mops durch Sylt. Franz jagt im komplett verwahrlosten Taxi quer durch
|
||||
Bayern. Zwölf Boxkämpfer jagen Viktor quer über den großen Sylter Deich. Vogel Quax zwickt Johnys Pferd Bim. Sylvia wagt quick
|
||||
den Jux bei Pforzheim. Polyfon zwitschernd aßen Mäxchens Vögel Rüben, Joghurt und Quark. ,,Fix, Schwyz!'' quäkt Jürgen blöd vom
|
||||
Paß. Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich. Falsches Üben von Xylophonmusik quält jeden größeren
|
||||
Zwerg. Heizölrückstoßabdämpfung.
|
||||
|
||||
aäb cde fgh ijk lmn oöp qrsß tuü vwx yz AÄBC DEF GHI JKL MNO ÖPQ RST UÜV WXYZ !"§ \$\%\& /() =?* ' \# \symbol{"7E} ²³ @`´ ©«» ¼ \{\} € - -- ---
|
||||
|
||||
123 456 789 0
|
||||
|
||||
}
|
||||
|
||||
|
||||
%% \usepackage[dvipsnames]{xcolor}
|
||||
%% \definecolor{red1}{rgb}{1,0,0}
|
||||
|
||||
%% \XeTeXinterchartokenstate=1
|
||||
%% \newXeTeXintercharclass\Subst
|
||||
|
||||
%% \XeTeXcharclass"F5F1=\Subst
|
||||
%% \XeTeXcharclass"232B=\Subst
|
||||
|
||||
|
||||
|
||||
%% \XeTeXinterchartoks 0 \Subst = {X}
|
||||
%% \XeTeXinterchartoks 255 \Subst = {X}
|
||||
%% \XeTeXinterchartoks \Subst 0 = {}
|
||||
%% \XeTeXinterchartoks \Subst 255 = {}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
\begin{document}
|
||||
|
||||
% \ttfamily\noindent
|
||||
% Override func viewDidLoad() {\\
|
||||
% super.viewDidLoad()\\
|
||||
% centralManager = CBCentralManager(delegate: self, queue: nil)\\
|
||||
% }
|
||||
|
||||
% x\\
|
||||
% 111111111\\
|
||||
% 888888888\\
|
||||
% lllllllll\\
|
||||
% WWWWWWWWW
|
||||
|
||||
\frontmatter
|
||||
\distributionseries{De\,Gruyter Studium}
|
||||
\seriestitle{Testdokumente aller Art}
|
||||
\transseriestitle{overall}
|
||||
|
||||
\seriessubtitle{Verschiedenste Testdokumente}
|
||||
\serieseditor[]{Max Mustermann und Moritz Maier}
|
||||
\seriesvolume{5/31}
|
||||
\subtitle{Unterscheidungshilfen für Fonts}
|
||||
\editor{Max Mustermann als Editor}
|
||||
\collaborator{Mustermann Stiftung}
|
||||
\transtitle{Help for differentiation of fonts}
|
||||
\edition{2. Auf\/lage}
|
||||
\publisherlogo{dg-mouton}
|
||||
\classification[Mathematics Subject Classification 2010]{35-02, 65-02, 65C30, 65C05, 65N35, 65N75, 65N80}
|
||||
\authorinfo{ Li Europan lingues es membres del sam familie. Lor separat existentie es un myth. Por scientie, musica, sport etc, litot Europa usa li sam vocabular. Li lingues differe solmen in li grammatica, li pronunciation e li plu commun vocabules. Omnicos directe al desirabilite de un nov lingua franca: On refusa continuar payar custosi traductores.\\\vskip\baselineskip At solmen va esser necessi far uniform grammatica, pronunciation e plu commun paroles. Ma quande lingues coalesce, li grammatica del resultant lingue es plu simplic e regulari quam ti del coalescent lingues. Li nov lingua franca va esser plu simplic e regulari quam li existent Europan lingues. It va esser tam simplic quam Occidental in fact, it va esser Occidental. A un Angleso it va semblar un simplificat Angles, quam un skeptic Cambridge amico dit me que Occidental es.}
|
||||
\copyrighttext{Copyright-Text}
|
||||
\openaccess
|
||||
\isbn{978-3-11-oooooo-o}
|
||||
\eisbnpdf{978-3-11-iiiiii-i}
|
||||
\eisbnepub{978-3-11-pppppp-p}
|
||||
\issn{0179-0986}
|
||||
\PCN{2018934806}
|
||||
% \eCIP{Names: Vogel-Heuser, Birgit, editor.\\
|
||||
% Title: Softwareagenten in der industrie 4.0 / Birgit Vogel-Heuser, editor.\\
|
||||
% Description: First edition. | Berlin/Boston : Walter de Gruyter GmbH, [2018]
|
||||
% | Includes bibliographical references and index.\\
|
||||
% Identifiers: LCCN 2018010937 (print) | LCCN 2018013733 (ebook) | ISBN
|
||||
% 9783110527056 (pdf) | ISBN 9783110524451 (softcover : alk. paper) | ISBN
|
||||
% 9783110524581 (epub)\\
|
||||
% Subjects: LCSH: Operations research--Data processing. | Support services
|
||||
% (Management)--Data processing. | Internet of things. | Artificial
|
||||
% intelligence. | Raspberry Pi (Computer)\\
|
||||
% Classification: LCC T57.6 (ebook) | LCC T57.6 .S626 2018 (print) | DDC
|
||||
% 658.4/034--dc23\\
|
||||
% LC record available at \url{https://lccn.loc.gov/2018010937}}
|
||||
\copyrightyear{2020}
|
||||
\cover{Cover-Firma}
|
||||
\typesetter{le-tex publishing services GmbH, Leipzig}
|
||||
\printbind{Druckerei XYZ}
|
||||
|
||||
\begin{advertisement}[Radon Series on Computational and Applied Mathematics]
|
||||
\otherpubl
|
||||
[DG_attention]
|
||||
[Volume 20]
|
||||
{Metrology and Theory of Measurement, 2013}
|
||||
{Valery A. Slaev, Anna G. Chunovkina, Leonid A. Mironovsky}
|
||||
{ISBN~978-3-11-028473-7, e-ISBN~978-3-11-028482-9, Set-ISBN~978-3-11-028483-6}
|
||||
|
||||
\otherpubl
|
||||
[DG_attention]
|
||||
[Volume 19]
|
||||
{Wetting of Real Surfaces, 2013}
|
||||
{Edward A. Bormashenko}
|
||||
{ISBN~978-3-11-025853-0, e-ISBN~978-3-11-025879-0, Set-ISBN~978-3-11-220375-0}
|
||||
|
||||
\otherpubl
|
||||
[DG_attention]
|
||||
[Volume 18]
|
||||
{Statistical Physics, 2012}
|
||||
{Michael V. Sadovskii}
|
||||
{ISBN~978-3-11-027031-0, e-ISBN~978-3-11-027037-2, Set-ISBN~978-3-11-027038-9}
|
||||
|
||||
\otherpubl
|
||||
[DG_attention]
|
||||
[Volume 17]
|
||||
{Quantum Field Theory, 2013}
|
||||
{Michael V. Sadovskii}
|
||||
{ISBN~978-3-11-027029-7, e-ISBN~978-3-11-027035-8, Set-ISBN~978-3-11-027036-5}
|
||||
|
||||
\otherpubl
|
||||
[DG_attention]
|
||||
[Volume 16]
|
||||
{Quantum Systems, Channels, Information, 2012}
|
||||
{Alexander S. Holevo}
|
||||
{ISBN~978-3-11-027325-0, e-ISBN~978-3-11-027340-3, Set-ISBN~978-3-11-027341-0}
|
||||
|
||||
\otherpubl
|
||||
[DG_attention]
|
||||
[Volume 15]
|
||||
{Numerical Continuum Mechanics, 2012}
|
||||
{Vladimir N. Kukudzhanov}
|
||||
{ISBN~978-3-11-027322-9, e-ISBN~978-3-11-027338-0, Set-ISBN~978-3-11-027339-7}
|
||||
|
||||
% \otherpubl
|
||||
% []
|
||||
% [Volume 14]
|
||||
% {Oleg N. Kirillov}
|
||||
% {Non-conservative Stability Problems of Modern Physics, 2013}
|
||||
% {ISBN~978-3-11-027034-1, e-ISBN~978-3-11-027043-3, Set-ISBN~978-3-11-027044-0}
|
||||
\end{advertisement}
|
||||
|
||||
|
||||
\maketitle
|
||||
|
||||
\dedication{To my grandmother\\ Marie-Louise Vanwelckenhuysen}
|
||||
|
||||
\tableofcontents
|
||||
\listoffigures
|
||||
\listoftables
|
||||
|
||||
\chapter{Kapiteltitel}\label{gge}
|
||||
|
||||
\DOI{DOI}
|
||||
|
||||
\kurzerblindtext
|
||||
|
||||
\section{Flattersatz}
|
||||
|
||||
\begin{flushleft}
|
||||
\kurzerblindtext
|
||||
\end{flushleft}
|
||||
|
||||
\chapter*{Autoreninformationen}
|
||||
|
||||
%\DOI{\bookDOI-fff}
|
||||
|
||||
%\begin{multicols}{2}
|
||||
\contributor
|
||||
{Max Mustermann}
|
||||
{Zentrum für Muster (ZfM)\\Christian-Albrechts-Universität zu Kiel\\ Boschstr.~1, 24118 Kiel 7, Deutschland}
|
||||
{mmustermann@gis.uni-kiel.de}
|
||||
{info}
|
||||
{}
|
||||
\contributor
|
||||
{Max Mustermann}
|
||||
{Zentrum für Muster (ZfM)\\Christian-Albrechts-Universität zu Kiel\\ Boschstr.~1, 24118 Kiel 7, Deutschland}
|
||||
{mmustermann@gis.uni-kiel.de}
|
||||
{info}
|
||||
{Max Mustermann ...}
|
||||
\vskip\baselineskip
|
||||
\contributor
|
||||
{Max Mustermann}
|
||||
{}%Zentrum für Geoinformation (ZfG)\\Christian-Albrechts-Universität zu Kiel\\ Boschstr.~1, 24118 Kiel 7, Deutschland}
|
||||
{}%mmustermann@gis.uni-kiel.de}
|
||||
{}%info}
|
||||
{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. }
|
||||
%\end{multicols}
|
||||
|
||||
\mainmatter
|
||||
|
||||
\partmotto{Hier der Test eines Partmottos. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. }
|
||||
|
||||
\part{Nummerierter Testteil}
|
||||
|
||||
\blindtext
|
||||
|
||||
|
||||
\contribution
|
||||
|
||||
\contributionauthor[1]{Max Müller}
|
||||
\contributionauthor[2]{Zwei Due}
|
||||
\contributionauthor[3]{Drei Tre}
|
||||
\contributionauthor[4]{Vier}
|
||||
\contributionauthor[5]{Fünf}
|
||||
%\contributionauthor[6]{Sechs}
|
||||
%\contributionauthor[5]{Sieben}
|
||||
\affil[1]{Institute of Marine Biology, National Taiwan Ocean University, 2 Pei-Ning Road Keelung 20224, Taiwan (R.O.C), e-mail: m.mueller@ntou.edu.tw}
|
||||
\affil[2]{2}
|
||||
\affil[3]{3}
|
||||
\affil[4]{4}
|
||||
\affil[5]{5}
|
||||
%\affil[6]{6}
|
||||
%\affil[7]{7}
|
||||
%\runningauthor{Müller}
|
||||
\contributiontitle{Ein Contributiontitle mit Controbutionnote\contributionnote{Hier die Contribution-Note}
|
||||
}\label{beitrag}
|
||||
%\contributionsubtitle{Sub}
|
||||
% \runningtitle{Was ist so anders am Neuroenhancement?}
|
||||
% \contributionsubtitle{Pharmakologische und mentale Selbstveränderung im ethischen Vergleich}
|
||||
\abstract{\kurzerblindtext}
|
||||
\transabstract{dududu}
|
||||
\keywords{Funktion, Überlieferung, Untersuchung, Hauptsache, Zeitraum, Darstellung, Inkrafttreten, Fassung}
|
||||
\transkeywords{nanana}
|
||||
\classification{65C05, 62M20, 93E11, 62F15, 86A22}
|
||||
%\DOI{10.1515/futur-2012-0001}
|
||||
\contributioncopyright[by-nc-nd]{2014}{Max Müller, published by De Gruyter.}{\hbox{This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivs 4.0 License.}}
|
||||
|
||||
\makecontributiontitle
|
||||
|
||||
\chapter{Schrifttests}
|
||||
|
||||
\section{Unterschiedliche Schriftvarianten}
|
||||
|
||||
\subsection{SFFamily}
|
||||
|
||||
{\sffamily \blindtext $\log x \text{text}$ , ‘text’, ‚text‛, “text”, „text‟, aʻA, aʼA, aʽA, A̒A̓A̔A̕̕ }
|
||||
|
||||
\subsection{Texttt}
|
||||
|
||||
{\texttt{\blindtext}}
|
||||
|
||||
\subsection{Textsc}
|
||||
|
||||
{\textsc{\blindtext}}
|
||||
|
||||
\subsection{Emph}
|
||||
|
||||
\emph{\blindtext}
|
||||
|
||||
\subsection{Textbf}
|
||||
|
||||
\textbf{\blindtext}
|
||||
|
||||
\section{Verschiedenes}
|
||||
|
||||
|
||||
|
||||
\subsection{Test von unterschiedlichen Umgebungen}
|
||||
|
||||
Aenean commodo \marginpar{Text in Randspalte} ligula eget dolor. Aenean
|
||||
massa. \footnote{Hier eine Fußnote} Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
|
||||
|
||||
Hier folgt der Test einer URL \href{http://www.nps.gov/maca/historyculture/physicianhealthyself.htm}{www.nps.gov/maca/historyculture/physicianhealthyself.htm}
|
||||
|
||||
x\textendash y
|
||||
|
||||
|
||||
\contributioncopyright[by-nc-nd]{2014}{Max Müller, published by De Gruyter.}{This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 License.}
|
||||
\DOI{10.1515/qua-2012-00X}
|
||||
|
||||
\kurzerblindtext
|
||||
|
||||
|
||||
\lstinline|1111111111Inline Listing|
|
||||
|
||||
\noindent
|
||||
\begin{lstlisting}
|
||||
1111111111111Hier der Test eines Listings
|
||||
1111111111111Hier der Test eines Listings
|
||||
1111111111111Hier der Test eines Listings
|
||||
1111111111111Hier der Test eines Listings
|
||||
1111111111111Hier der Test eines Listings
|
||||
1111111111111Hier der Test eines Listings
|
||||
1111111111111Hier der Test eines Listings
|
||||
\end{lstlisting}
|
||||
|
||||
\noindent
|
||||
\begin{lstlisting}[numbers=left]
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
1111111111111Hier der Test eines Listings mit Nummern
|
||||
\end{lstlisting}
|
||||
|
||||
Zahlen im Text und danach im Mathemodus
|
||||
1234567890\\
|
||||
$1234567890$
|
||||
|
||||
|
||||
|
||||
|
||||
\begin{acknowledgement}
|
||||
\kurzerblindtext
|
||||
\end{acknowledgement}
|
||||
|
||||
\begin{funding}
|
||||
\kurzerblindtext
|
||||
\end{funding}
|
||||
|
||||
\begin{conflictofinterest}
|
||||
\kurzerblindtext
|
||||
\end{conflictofinterest}
|
||||
|
||||
\subsubsection{Legaltext}
|
||||
|
||||
\begin{legaltext}
|
||||
\kurzerblindtext
|
||||
\end{legaltext}
|
||||
|
||||
|
||||
|
||||
\subsubsection{Quote und Quotation}
|
||||
|
||||
\begin{quote}
|
||||
\kurzerblindtext
|
||||
\end{quote}
|
||||
|
||||
\begin{quotation}
|
||||
\kurzerblindtext
|
||||
\end{quotation}
|
||||
|
||||
|
||||
|
||||
|
||||
\subsubsection{Notes}
|
||||
|
||||
\paragraph{Note}
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
|
||||
|
||||
\begin{note}
|
||||
\kurzerblindtext
|
||||
\end{note}
|
||||
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
|
||||
|
||||
\paragraph{Note mit Symbol}
|
||||
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
|
||||
|
||||
\begin{note}[DG_notice]
|
||||
\kurzerblindtext
|
||||
\end{note}
|
||||
|
||||
\subsubsection{Mathematische Umgebungen}
|
||||
|
||||
|
||||
\begin{definition}[Hallo \textit{B}$B$]By a \textit{Pfaffian chain}, we mean a sequence of real analytic functions
|
||||
\begin{equation*}
|
||||
f_1(x), f_2(x), \dots, f_r(x)
|
||||
\end{equation*}
|
||||
defined on $\mathbb{R}^n$ which, for every $j=1,\dots,r$, satisfy a system of partial differential equations
|
||||
\begin{equation*}
|
||||
\frac{\partial f_j}{\partial x_k}= g_{kj}(x, f_1(x), \dots, f_j(x)),\ \ j=1,\dots,n,
|
||||
\end{equation*}
|
||||
with polynomials $g_{kj}$. \item For each Pfaffian chain, the integer~$r$ is called its \textit{length}, and the largest of the degrees of polynomials $g_{kj}$ is called its \textit{degree}.
|
||||
\item A function $f(x)$ is called \textit{Pfaffian} if it appears in a Pfaffian chain.
|
||||
\end{definition}
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
|
||||
|
||||
\begin{theorem}[Theorem of $a$\textit{a}]\label{convergenzedeboliqo}
|
||||
Let $f_n$ be a~sequence of functions and $f$ be a~function in
|
||||
$L^p(\Omega), p>1$. Assume that
|
||||
\begin{enumerate}
|
||||
\item $f_n$ is bounded in $L^p(\Omega)$;
|
||||
\item $f_n\to f$ a.e.\ in~$\Omega$.
|
||||
\end{enumerate}
|
||||
Then $f_n \to f$ in $L^q(\Omega)$, for every $q\in [1,p)$ and weakly
|
||||
in $L^p(\Omega)$.
|
||||
\end{theorem}
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
|
||||
|
||||
\begin{theorem}[Test Theorem Überschrift]\label{3T1}
|
||||
Suppose assumption \ref{convergenzedeboliqo} holds.\break Then the viability $P_T$ of system \eqref{2.1.3} can be estimated uniformly in $u(0)$ through $\mathop{\text{Comp}}_N$, i.e.,
|
||||
\begin{equation*}
|
||||
P_T(\Pi_{\mathcal{K}}, u(0)) < g(T, V, K_*, \bar \theta, r),
|
||||
\end{equation*}
|
||||
where a function~$g$ converges to $0$ as $T \to \infty$ for all fixed values $V, K_*, \bar \theta, r$ and $g$ is monotone increasing in $V$. Moreover, if $V, K_*, \bar \theta, r$ are fixed, survival probability $P_T \to 0 $ as $T \to \infty$.
|
||||
\end{theorem}
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
|
||||
|
||||
\begin{lemma}\label{3L1}
|
||||
Under condition \eqref{convergenzedeboliqo} one has
|
||||
\begin{equation} \label {2.1.3}
|
||||
P_{T, \delta, \eta}= \mathop{\textnormal{Prob}}\{\xi: \ \xi(t) \in V_{\eta, \delta, 0, T} \ \text{for each} \ t \in [0,T] \}> 0.
|
||||
\end{equation}
|
||||
\end{lemma}
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
|
||||
|
||||
\begin{proof}
|
||||
Suppose $\eta(t)$ is a smooth function with the values in $\textbf{R}^p$ defined on $[t_1,t_2],\allowbreak
|
||||
t_2 > t_1$. Let $V_{\eta, \delta, t_1, t_2}$ be a tubular neighborhood of the
|
||||
trajectory~$\eta$:
|
||||
\begin{equation}
|
||||
V_{\eta, \delta, t_1, t_2}=\{ v: \ \text{there is} \ t \in [t_1, t_2] \ \text{such that} \ \ |v -\eta(t)| <\delta\}. \label{2.1.2}
|
||||
\end{equation}
|
||||
This lemma is an immediate consequence of Assumption \ref{convergenzedeboliqo}.
|
||||
\end{proof}
|
||||
|
||||
|
||||
|
||||
\subsubsection{Listen}
|
||||
|
||||
\begin{itemize}
|
||||
\item Aufzählung
|
||||
\item Aufzählung
|
||||
\item Aufzählung Aufzählung Aufzählung Aufzählung
|
||||
\end{itemize}
|
||||
|
||||
\begin{enumerate}
|
||||
\item Nummerierte Aufzählung
|
||||
\item Nummerierte Aufzählung
|
||||
\item Nummerierte Aufzählung Nummerierte Aufzählung Nummerierte Aufzählung Nummerierte Aufzählung
|
||||
\end{enumerate}
|
||||
|
||||
\begin{description}
|
||||
\item[Hallo $Hallo$] Beschreibungslisteneintrag
|
||||
\item[Hallo $Hallo$ gkaläf] Beschreibungslisteneintrag
|
||||
\item[Hallo $Hallo$ gkaläf] Beschreibungslisteneintrag
|
||||
\item[Hallo $Hallo$ gkaläf] Beschreibungslisteneintrag
|
||||
\end{description}
|
||||
|
||||
|
||||
Vortext\\
|
||||
Vortext
|
||||
\begin{itemize}
|
||||
\item geschachtelte Aufzählung:
|
||||
\begin{itemize}
|
||||
\item geschachtelte Aufzählung
|
||||
\item geschachtelte Aufzählung
|
||||
\end{itemize}
|
||||
\item geschachtelte Aufzählung
|
||||
\end{itemize}
|
||||
|
||||
Enumerate geschachtelt
|
||||
\begin{enumerate}
|
||||
\item Enumerate geschachtelt\cite{Bourbaki1}
|
||||
\item Enumerate geschachtelt\cite{Bourbaki2}
|
||||
\begin{enumerate}
|
||||
\item Enumerate geschachtelt
|
||||
\item Enumerate geschachtelt
|
||||
\end{enumerate}
|
||||
\end{enumerate}
|
||||
|
||||
|
||||
\subsubsection{Gleichungen}
|
||||
|
||||
\begin{equation}\label{eq:4.6}
|
||||
L_{\text{b}} = \frac{\lambda}{\Delta n}\,. \underbrace{xdftgrr}_{12} \overbrace{dfrteer}^{45}
|
||||
% \label{L_b}
|
||||
\end{equation}
|
||||
|
||||
x\\
|
||||
lim\,sup\\
|
||||
%%{\fontfamily{minionmath}\selectfont lim\,sup}\\
|
||||
$\limsup x $
|
||||
|
||||
|
||||
$\Gamma\Delta$
|
||||
|
||||
$\mathcal{A}$
|
||||
|
||||
$\mathscr{A}$
|
||||
|
||||
$\mathfrak{A} $%\betaup\betait\upbeta
|
||||
|
||||
{\mathversion{bold}
|
||||
$\mathcal{A}$
|
||||
|
||||
$\mathscr{A}$
|
||||
|
||||
$\mathfrak{A} $%\betaup\betait\upbeta
|
||||
}
|
||||
|
||||
\subsubsection{Zahlen in Text und Tabellen}
|
||||
|
||||
Text\\
|
||||
1111111\\
|
||||
9999999\\
|
||||
Tabelle\\
|
||||
\begin{tabular}{ll}
|
||||
1111111\\
|
||||
9999999\\
|
||||
\end{tabular}
|
||||
|
||||
|
||||
|
||||
\subsubsection{Zeilennummern}
|
||||
\linenumbers
|
||||
|
||||
\noindent
|
||||
|
||||
\kurzerblindtext
|
||||
|
||||
\nolinenumbers
|
||||
|
||||
\subsubsection{Randnummer}
|
||||
|
||||
\noindent\recital{23}%
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.
|
||||
|
||||
\subsubsection{Sub subsection}
|
||||
|
||||
Sub subsection Text
|
||||
|
||||
\paragraph{Paragraph}
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
|
||||
|
||||
\section{Schachtelungen Abschnitt}
|
||||
|
||||
\subsection{Schachtelungen Unterababschnitt}
|
||||
|
||||
\subsubsection{Schachtelungen Unterunterababschnitt}
|
||||
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
|
||||
|
||||
Ihre Funktion als Teil der literarischen Darstellung und Technik\footnote{Karl Auer: Übergreifende
|
||||
Fragestellung zur besseren Darstellungsweise (1768, 295296)} enthält auch einen vollständigen
|
||||
textkritischen Apparat. Auch umfasst die Untersuchung in der Hauptsache\footnote{John Stewart Mill: Funktion als Teil der literarischen Darstellung (1768, 295296) um 1900 entwickelt Argumentationen für die anlaufenden und nicht mehr einsetzbaren Fragen.}\footnote{Zwei} den Zeitraum zwischen dem
|
||||
Inkrafttreten und der Darstellung in seiner heute geltenden Fassung.\footnote{Vgl. von unschätzbarem Wert war die Hilfsbereitschaft der Mitarbeiter und Ehemaligen.} Auch beim Konzept\footnote{Ernst Mayr: Übergreifende Fragestellung zur besseren Darstellungsweise (1768, 295296)} der
|
||||
ästhetischen Bildung von Wissen und dessen möglichst rasche und erfolgsorientierte Anwendung
|
||||
verspielen Einsichten und Gewinne ohne den Bezug auf die um 1900 entwickelten Argumentationen.
|
||||
|
||||
\footnotetextA[1]{lehnt: borget K.}%
|
||||
\footnotetextA[3]{erweisen: versuchen K.}%
|
||||
\footnotetextA[6]{redest nicht anders: redest K.}%
|
||||
\footnotetextA[7]{bereits in einem un dem andern bey Erfahrung in die Schule gegabgeb wärest: in der Schule der Erfahrung kein Jüngling mehr seyn möchtest K.}%
|
||||
\footnotetextA[10]{würde: solte K.}%
|
||||
\footnotetextA[11]{beyzutragen wissen: beytragen können K.}%
|
||||
\footnotetextA[15]{Treue: Tugend K.}%
|
||||
\footnotetextA[20]{unterfangen: wagen K.}%
|
||||
\footnotetextA[21]{so weit: so K.}%
|
||||
\footnotetextA[23]{gehabt: gedultet K.}%
|
||||
\footnotetextA[29]{Ja ich: Ich K.}%
|
||||
\footnotetextA[31]{machen dürffen: ausführen will K.}%
|
||||
|
||||
Auch umfasst die Untersuchung in der Hauptsache den Zeitraum zwischen dem Inkrafttreten und der
|
||||
Darstellung. Ihre Funktion als Teil der literarischen Darstellung und narrativen Technik enthält
|
||||
auch einen vollständigen. Auch umfasst die Untersuchung in der Hauptsache den Zeitraum zwischen dem
|
||||
Inkrafttreten und der Darstellung in seiner heute geltenden Fassung. Ihre Funktion als Teil der
|
||||
literarischen Darstellung und narrativen Technik enthält auch einen vollKommentierung stütze ich
|
||||
mich weitgehend.
|
||||
|
||||
\newpage
|
||||
|
||||
\noindent
|
||||
Diese umfasst die Untersuchung in der Hauptsache den Zeitraum zwischen dem Inkrafttreten und der
|
||||
Darstellung in seiner heute geltenden Fassung.
|
||||
|
||||
\begin{figure}[t]
|
||||
\leavevmode\textcolor[gray]{0.9}{\vrule width0.75\hsize height6\baselineskip depth0pt}
|
||||
\caption[Von unschätzbarem Wert]{Von unschätzbarem Wert war die Hilfsbereitschaft der Mitarbeiter und ehemaligen Kollegen
|
||||
des Lehrgebiets; abgesehen von dem knapp gehaltenen Exkurs in die Zeit des gemeinen Rechts, steht
|
||||
die Analyse der Texte in ihrer überlieferten Form im Vordergrund. $x+y=2\sqrt{5}\int x^2{d}x$}\label{fig:1}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}
|
||||
Objekt\vrule height0.7\baselineskip
|
||||
\caption[lorem. Maecenas nec odio et ante tincidunt tempus.]{lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc}
|
||||
\end{figure}
|
||||
|
||||
|
||||
\begin{SCfigure} %[h]
|
||||
\leavevmode\textcolor[gray]{0.9}{\vrule width0.5\hsize height6\baselineskip depth0pt}
|
||||
\caption[Von unschätzbarem Wert]{Von unschätzbarem Wert war die Hilfsbereitschaft der Mitarbeiter und ehemaligen Kollegen.}\label{fig:2}
|
||||
\end{SCfigure}
|
||||
|
||||
\noindent
|
||||
Auch beim Konzept der ästhetischen Bildung von Wissen und dessen möglichst rasche und
|
||||
erfolgsorientierte Anwendung verspielen Einsichten und Gewinne ohne den Bezug auf die um 1900
|
||||
entwickelten Argumentationen. \ref{fig:1}
|
||||
|
||||
\newpage
|
||||
|
||||
\begin{SCtable} %[t!]
|
||||
\caption{Narrative Technik, Differenzierung, Textkritischer Apparat und ästhetische Bildung.}
|
||||
|
||||
{\baretabulars
|
||||
\Tree [.CP [.{\sc Spec}(CP) {which car} ] {\ldots} ]
|
||||
}
|
||||
|
||||
|
||||
\begin{tabular}{lD{.}{,}{2}}
|
||||
1111111 & x.y\\\midrule
|
||||
\cellcolor{red}{9999999}\\
|
||||
9999999\\\cmidrule{1-1}
|
||||
9999999\\
|
||||
9999999\\
|
||||
$9999999$\\
|
||||
$1111111$\\
|
||||
\end{tabular}
|
||||
|
||||
\baretabulars
|
||||
\begin{tabular}{ll}
|
||||
1111111\\\midrule
|
||||
\cellcolor{red}{9999999}\\
|
||||
9999999\\\cmidrule{1-1}
|
||||
9999999\\
|
||||
9999999\\
|
||||
\end{tabular}
|
||||
|
||||
\layouttabulars
|
||||
\begin{tabular}{ll}
|
||||
1111111\\\midrule
|
||||
9999999\\
|
||||
9999999\\\cmidrule{1-1}
|
||||
9999999\\
|
||||
9999999\\
|
||||
\end{tabular}
|
||||
\end{SCtable}
|
||||
|
||||
|
||||
\bgroup
|
||||
\captionsetup[table]{position=below}
|
||||
\begin{table}[!ht]
|
||||
\begin{tabularx}{\hsize}{Xcc<{\hskip2\tabcolsep}>{\hskip2\tabcolsep}cc<{\hskip2\tabcolsep}>{\hskip2\tabcolsep}ccc}
|
||||
&\multicolumn{2}{c}{(rvoc):{[r]}}&\multicolumn{2}{c}{(l):[V]}&\multicolumn{2}{c}{(t):[\textipa{P}]}\\
|
||||
& Read S & Spont S & Read S & Spont S & Read S & Spont S \\
|
||||
\midrule
|
||||
MCO & 88.21 & 93.17 & 13.69 & 0.10 & 0.73 & \multirow{2}{*}{56.56} \\
|
||||
MCY & 81.41 & 91.21 & 13.94 & 0.00 & 4.65 & & \\
|
||||
WCO & 62.91 & 72.23 & 12.05 & 0.42 & 6.91 & \multirow{2}{*}{92.47} \\
|
||||
WCY & 17.56 & 13.98 & 47.13 & 8.83 & 76.32 & & \\
|
||||
\end{tabularx}
|
||||
\caption{Style shifting examples in the 1997 corpus ((rV) RS $n=1103$, SS $n=8170$; (l) RS $n=656$, SS $n=3420$; (t) RS $n=1212$, SS $n=2385$)}
|
||||
\label{6t55}
|
||||
\end{table}
|
||||
\egroup
|
||||
|
||||
\begin{table}[!ht]
|
||||
\caption{Style shifting examples in the 1997 corpus ((rV) RS $n=1103$, SS $n=8170$; (l) RS $n=656$, SS $n=3420$; (t) RS $n=1212$, SS $n=2385$)}
|
||||
\label{6t56}
|
||||
\begin{tabularx}{\hsize}{Xcc<{\hskip2\tabcolsep}>{\hskip2\tabcolsep}cc<{\hskip2\tabcolsep}>{\hskip2\tabcolsep}ccc}
|
||||
&\multicolumn{2}{c}{(rvoc):{[r]}}&\multicolumn{2}{c}{(l):[V]}&\multicolumn{2}{c}{(t):[\textipa{P}]}\\
|
||||
& Read S & Spont S & Read S & Spont S & Read S & Spont S \\
|
||||
\midrule
|
||||
MCO & 88.21 & 93.17 & 13.69 & 0.10 & 0.73 & \multirow{2}{*}{56.56} \\
|
||||
MCY & 81.41 & 91.21 & 13.94 & 0.00 & 4.65 & & \\
|
||||
WCO & 62.91 & 72.23 & 12.05 & 0.42 & 6.91 & \multirow{2}{*}{92.47} \\
|
||||
WCY & 17.56 & 13.98 & 47.13 & 8.83 & 76.32 & & \\
|
||||
\end{tabularx}
|
||||
\end{table}
|
||||
|
||||
\begin{table}[!ht]
|
||||
\caption{Style shifting examples in the 1997 corpus ((rV) RS $n=1103$, SS $n=8170$; (l) RS $n=656$, SS $n=3420$; (t) RS $n=1212$, SS $n=2385$)}
|
||||
\label{6t56}
|
||||
\begin{tabularx}{\hsize}{Xccccccc}
|
||||
&\multicolumn{2}{c}{(rvoc):{[r]}}&\multicolumn{2}{c}{(l):[V]}&\multicolumn{2}{c}{(t):[\textipa{P}]}\\
|
||||
& Read S & Spont S & Read S & Spont S & Read S & Spont S \\
|
||||
\midrule
|
||||
\begin{enumerate}
|
||||
\item 4444
|
||||
\end{enumerate}ddd
|
||||
& 88.21 & 93.17 & 13.69 & 0.10 & 0.73 & \multirow{2}{*}{56.56} \\
|
||||
MCY & 81.41 & 91.21 & 13.94 & 0.00 & 4.65 & & \\
|
||||
WCO & 62.91 & 72.23 & 12.05 & 0.42 & 6.91 & \multirow{2}{*}{92.47} \\
|
||||
WCY & 17.56 & 13.98 & 47.13 & 8.83 & 76.32 & & \\
|
||||
\begin{itemize}
|
||||
\item eins
|
||||
\item zwei
|
||||
\item drei erfolgsorientierte Anwendung verspielen Einsichten und Gewinne ohne den Bezug auf die um 1900\vskip-\baselineskip
|
||||
\end{itemize}
|
||||
& 17.56 & 13.98 & 47.13 & 8.83 & 76.32 & & \\
|
||||
WCY & 17.56 & 13.98 & 47.13 & 8.83 & 76.32 & & \\
|
||||
\end{tabularx}
|
||||
\end{table}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
\kurzerblindtext
|
||||
|
||||
\contributionnote{End contrib note Konzept der ästhetischen Bildung von Wissen und dessen möglichst rasche und erfolgsorientierte Anwendung verspielen Einsichten und Gewinne ohne den Bezug auf die um 1900 entwickelten Argumentationen. Auch umfasst die Untersuchung in der Hauptsache den Zeitraum zwischen dem Inkrafttreten und der Da}
|
||||
|
||||
|
||||
|
||||
\chapter{Kapitel nummeriert}
|
||||
Donec vitae sapien ut libero
|
||||
|
||||
\section{Abschnitt}
|
||||
Donec vitae sapien ut libero
|
||||
|
||||
\subsection{Subsection-Abschnitt}
|
||||
Donec vitae sapien ut libero
|
||||
|
||||
\subsubsection{SubSubsection-Abschnitt}
|
||||
Donec vitae sapien ut libero
|
||||
|
||||
\paragraph{Paragraph-Abschnitt}
|
||||
Donec vitae sapien ut libero
|
||||
|
||||
\subparagraph{Subparagraph-Abschnitt}
|
||||
Donec vitae sapien ut libero
|
||||
|
||||
Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
|
||||
|
||||
|
||||
|
||||
\recital{1}In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
|
||||
|
||||
\recital{2}In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
|
||||
|
||||
|
||||
|
||||
|
||||
\index{ARegistereintrag}
|
||||
\index{ARegistereintr\"agg} ARegistereintr\"agg
|
||||
\index{ARegistereintr\"aggbabel} ARegistereintr"aggbabel
|
||||
\index{ARegistereintraggg}
|
||||
\index{ARegistereintragggg}
|
||||
\index{Registereintrag}
|
||||
\index{Registereintrag Registereintrag Registereintrag Registereintrag Registereintrag }
|
||||
\index{Registereintrag!Untereintrag Untereintrag Untereintrag Untereintrag}
|
||||
\index{Registereintrag!Untereintrag Untereintrag Untereintrag Untereintrag!Unteruntereintrag}
|
||||
\index{BRegistereintrag}
|
||||
\index{CRegistereintrag}
|
||||
|
||||
\chapter{Unicode Test}
|
||||
|
||||
\section{Serif}
|
||||
|
||||
\subsection{Fehlende Zeichen}
|
||||
← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ∂ ∅ ∆ ∏ ∑ − ∕ ∙ √ ∞ ∫ ∼ ≈ ≠ ≤ ≥ ⋅ ⌈ ⌉ ⌊ ⌋ 〈 〉 ⏑ ⏒ ⏓ ⏔ ⏕ ⏖ ␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ ␠ ␡ ␢ ␣  ␥ ␦ ■ □ ▴ ▸ ▾ ◂ ◊ ○ ● ♾ ⟦ ⟧ ⟨ ⟩ ⟪ ⟫
|
||||
|
||||
\subsection{Diakritische Zeichen}
|
||||
|
||||
basser uͤben mitt den werck der cluͦgen wortten, ouch vorbet der ritterschaft geuͤbett sind
|
||||
|
||||
aͣaͤaͥaͦaͧaͨaͩaͪaͫaͬaͭaͮaͯ
|
||||
|
||||
\subsection{Private Use Area}
|
||||
|
||||
|
||||
|
||||
\newpage
|
||||
|
||||
\section{Sans}
|
||||
|
||||
\subsection{Fehlende Zeichen}
|
||||
|
||||
{\sffamily ← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ∂ ∅ ∆ ∏ ∑ − ∕ ∙ √ ∞ ∫ ∼ ≈ ≠ ≤ ≥ ⋅ ⌈ ⌉ ⌊ ⌋ 〈 〉 ⏑ ⏒ ⏓ ⏔ ⏕ ⏖ ␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ ␠ ␡ ␢ ␣  ␥ ␦ ■ □ ▴ ▸ ▾ ◂ ◊ ○ ● ♾ ⟦ ⟧ ⟨ ⟩ ⟪ ⟫ }
|
||||
|
||||
\subsection{Diakritische Zeichen}
|
||||
|
||||
{\sffamily basser uͤben mitt den werck der cluͦgen wortten, ouch vorbet der ritterschaft geuͤbett sind
|
||||
|
||||
aͣaͤaͥaͦaͧaͨaͩaͪaͫaͬaͭaͮaͯ ͣ }
|
||||
|
||||
\subsection{Private Use Area}
|
||||
|
||||
{\sffamily }
|
||||
|
||||
|
||||
\backmatter
|
||||
|
||||
\begin{thebibliography}{99}%\DOI{ggg}
|
||||
\bibitem[K\"othe(1960)]{Kothe} G. K\"othe, \emph{Topologische Lineare R\"aume}, Springer-Verlag, Berlin (1960).
|
||||
\bibitem[Schwartz(1965)]{Schwartz1} L. Schwartz, \emph{M\'ethodes Math\'ematiques pour les Sciences Physiques}, Hermann, Paris (1965).
|
||||
\bibitem[Schwartz(1978)]{Schwartz2} L. Schwartz, \emph{Th\'eorie des Distributions}, nouvelle \'edition, Hermann, Paris (1978).
|
||||
\bibitem[Stein and Weiss(1971)]{Stein-Weiss} E.M. Stein and G. Weiss, \emph{Introduction to Fourier Analysis on Euclidean Spaces}, Princeton University Press, Princeton (1971).
|
||||
\bibitem[Taylor and Lay(1980)]{Taylor} A.E. Taylor and D.C. Lay, \emph{Introduction to Functional Analysis}, second edition, John Wiley and Sons, New York (1980).
|
||||
\bibitem[Thomas(2000)]{Thomas} E.G.F. Thomas, \emph{Path distributions on sequence spaces}, preprint (2000).
|
||||
\bibitem[Titchnarsh(1937)]{Titchmarsh}E.C. Titchnarsh, \emph{Theory of Fourier Integrals}, Oxford University Press, Oxford (1937).
|
||||
\bibitem[Tr\`eves(1967)]{Treves} F. Tr\`eves, \emph{Topological Vector Spaces, Distributions and Kernels}, Academic Press, New York (1967).
|
||||
\bibitem[Whittaker and Watson(1980)]{Whittaker-Watson} E.T. Whittaker and G.N. Watson, \emph{A Course of Modern Analysis}, Cambridge University Press, Cambridge (1980).
|
||||
\bibitem[Widder(1941)]{Widder} D. Widder, \emph{The Laplace Transform}, Princeton University Press, Princeton (1941).
|
||||
\end{thebibliography}
|
||||
|
||||
\def\indexpreamble{Auch umfasst die Untersuchung in der Hauptsache den Zeitraum zwischen dem
|
||||
Inkrafttreten und der Darstellung in seiner heute geltenden Fassung. Ihre Funktion als Teil der
|
||||
literarischen Darstellung und narrativen Technik enthält auch einen vollständigen textkritischen
|
||||
Apparat und ein Verzeichnis der Stellen.}
|
||||
|
||||
\printindex
|
||||
|
||||
\makeadvertisement
|
||||
\end{document}
|
||||
Reference in New Issue
Block a user