From e7b684753cea12b35ed0d56e818b1a2ff7e5c059 Mon Sep 17 00:00:00 2001 From: Torma Date: Tue, 27 Oct 2020 01:30:48 +0100 Subject: [PATCH] latex done --- .drone.yml | 11 + .gitignore | 98 + .project | 17 + .settings/org.eclipse.core.resources.prefs | 2 + .texlipse | 14 + LICENSE | 625 -- README.md | 8 +- pdf/.gitignore | 2 + src/.kile/thesis.kilepr.gui | 240 + src/Makefile | 68 + src/bib/mybib.bib | 402 ++ src/content/abstract.tex | 37 + src/content/acknowledgement.tex | 9 + src/content/appendices.tex | 209 + src/content/closing.tex | 60 + src/content/create-functions.tex | 60 + src/content/introduction.tex | 10 + src/content/preparation.tex | 22 + src/content/results.tex | 8 + src/content/theory.tex | 24 + src/figures/bme_logo.pdf | Bin 0 -> 20185 bytes src/figures/classification-service-rps.png | Bin 0 -> 57371 bytes .../classification-service-runtime.png | Bin 0 -> 53033 bytes src/figures/cloud-arch (8).drawio | 1 + src/figures/cloud-arch-class.pdf | Bin 0 -> 43256 bytes src/figures/cloud-arch-k8s-general-ach.pdf | Bin 0 -> 18578 bytes src/figures/cloud-arch-phys.pdf | Bin 0 -> 35387 bytes src/figures/cloud-arch-redesigned.pdf | Bin 0 -> 31454 bytes src/figures/convert.cmd | 7 + src/figures/input-service-rps.png | Bin 0 -> 53574 bytes src/figures/input-service-runtime.png | Bin 0 -> 34667 bytes src/figures/input-svc-latency.png | Bin 0 -> 52295 bytes src/figures/microservice-comparison.png | Bin 0 -> 48351 bytes src/figures/mqtt-latency.png | Bin 0 -> 37240 bytes src/figures/softwarecomparison-benchmarks.png | Bin 0 -> 35385 bytes src/figures/storage-service-runtime.png | Bin 0 -> 49541 bytes src/huplain.bst | 1910 ++++++ src/include/declaration.tex | 32 + src/include/guideline.tex | 54 + src/include/packages.tex | 73 + src/include/preamble.tex | 125 + src/include/project.tex | 10 + src/include/tdk-variables.tex | 11 + src/include/thesis-en.tex | 57 + src/include/thesis-hu.tex | 46 + src/include/titlepage-otdk.tex | 58 + src/include/titlepage-tdk.tex | 32 + src/include/titlepage.tex | 33 + src/lua/language.dat.lua | 731 +++ src/magyar.ldf | 5801 +++++++++++++++++ src/thesis.kilepr | 85 + src/thesis.tex | 111 + 52 files changed, 10477 insertions(+), 626 deletions(-) create mode 100644 .drone.yml create mode 100644 .gitignore create mode 100644 .project create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .texlipse delete mode 100644 LICENSE create mode 100644 pdf/.gitignore create mode 100644 src/.kile/thesis.kilepr.gui create mode 100644 src/Makefile create mode 100644 src/bib/mybib.bib create mode 100644 src/content/abstract.tex create mode 100644 src/content/acknowledgement.tex create mode 100644 src/content/appendices.tex create mode 100644 src/content/closing.tex create mode 100644 src/content/create-functions.tex create mode 100644 src/content/introduction.tex create mode 100644 src/content/preparation.tex create mode 100644 src/content/results.tex create mode 100644 src/content/theory.tex create mode 100644 src/figures/bme_logo.pdf create mode 100644 src/figures/classification-service-rps.png create mode 100644 src/figures/classification-service-runtime.png create mode 100644 src/figures/cloud-arch (8).drawio create mode 100644 src/figures/cloud-arch-class.pdf create mode 100644 src/figures/cloud-arch-k8s-general-ach.pdf create mode 100644 src/figures/cloud-arch-phys.pdf create mode 100644 src/figures/cloud-arch-redesigned.pdf create mode 100644 src/figures/convert.cmd create mode 100644 src/figures/input-service-rps.png create mode 100644 src/figures/input-service-runtime.png create mode 100644 src/figures/input-svc-latency.png create mode 100644 src/figures/microservice-comparison.png create mode 100644 src/figures/mqtt-latency.png create mode 100644 src/figures/softwarecomparison-benchmarks.png create mode 100644 src/figures/storage-service-runtime.png create mode 100644 src/huplain.bst create mode 100644 src/include/declaration.tex create mode 100644 src/include/guideline.tex create mode 100644 src/include/packages.tex create mode 100644 src/include/preamble.tex create mode 100644 src/include/project.tex create mode 100644 src/include/tdk-variables.tex create mode 100644 src/include/thesis-en.tex create mode 100644 src/include/thesis-hu.tex create mode 100644 src/include/titlepage-otdk.tex create mode 100644 src/include/titlepage-tdk.tex create mode 100644 src/include/titlepage.tex create mode 100644 src/lua/language.dat.lua create mode 100644 src/magyar.ldf create mode 100644 src/thesis.kilepr create mode 100644 src/thesis.tex diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..b7d1acb --- /dev/null +++ b/.drone.yml @@ -0,0 +1,11 @@ +kind: pipeline +type: docker +name: default + +steps: +- name: build + image: moss/xelatex + commands: + - cd src + - make + - cd .. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..13d7e50 --- /dev/null +++ b/.gitignore @@ -0,0 +1,98 @@ +thesis.pdf +thesis-pdflatex*.pdf +thesis-xelatex*.pdf +thesis-lualatex*.pdf + +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc + +## Intermediate documents: +*.dvi +# these rules might exclude image files for figures etc. +*.ps +*.eps +#*.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Auxiliary and intermediate files from other packages: + +# algorithms +*.alg +*.loa + +# amsthm +*.thm + +# beamer +*.nav +*.snm +*.vrb + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls + +# hyperref +*.brf + +# listings +*.lol + +# makeidx +*.idx +*.ilg +*.ind +*.ist + +# minitoc +*.maf +*.mtc +*.mtc0 + +# minted +*.pyg + +# nomencl +*.nlo + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# todonotes +*.tdo + +# xindy +*.xdy +/tmp +/out + +*.bib~* diff --git a/.project b/.project new file mode 100644 index 0000000..4a197ff --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + diploma + + + + + + net.sourceforge.texlipse.builder.TexlipseBuilder + + + + + + net.sourceforge.texlipse.builder.TexlipseNature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..6d65655 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=utf-8 diff --git a/.texlipse b/.texlipse new file mode 100644 index 0000000..8542bd0 --- /dev/null +++ b/.texlipse @@ -0,0 +1,14 @@ +#TeXlipse project settings +#Thu Aug 14 18:19:20 CEST 2014 +markTmpDer=true +builderNum=2 +outputDir=pdf +makeIndSty= +bibrefDir= +outputFormat=pdf +tempDir=tmp +mainTexFile=diploma.tex +outputFile=diploma.pdf +langSpell=hu +markDer=true +srcDir=src diff --git a/LICENSE b/LICENSE deleted file mode 100644 index e142a52..0000000 --- a/LICENSE +++ /dev/null @@ -1,625 +0,0 @@ -GNU GENERAL PUBLIC LICENSE - -Version 3, 29 June 2007 - -Copyright © 2007 Free Software Foundation, Inc. - -Everyone is permitted to copy and distribute verbatim copies of this license -document, but changing it is not allowed. - -Preamble - -The GNU General Public License is a free, copyleft license for software and -other kinds of works. - -The licenses for most software and other practical works are designed to take -away your freedom to share and change the works. By contrast, the GNU General -Public License is intended to guarantee your freedom to share and change all -versions of a program--to make sure it remains free software for all its users. -We, the Free Software Foundation, use the GNU General Public License for most -of our software; it applies also to any other work released this way by its -authors. You can apply it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our -General Public Licenses are designed to make sure that you have the freedom -to distribute copies of free software (and charge for them if you wish), that -you receive source code or can get it if you want it, that you can change -the software or use pieces of it in new free programs, and that you know you -can do these things. - -To protect your rights, we need to prevent others from denying you these rights -or asking you to surrender the rights. Therefore, you have certain responsibilities -if you distribute copies of the software, or if you modify it: responsibilities -to respect the freedom of others. - -For example, if you distribute copies of such a program, whether gratis or -for a fee, you must pass on to the recipients the same freedoms that you received. -You must make sure that they, too, receive or can get the source code. And -you must show them these terms so they know their rights. - -Developers that use the GNU GPL protect your rights with two steps: (1) assert -copyright on the software, and (2) offer you this License giving you legal -permission to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains that -there is no warranty for this free software. For both users' and authors' -sake, the GPL requires that modified versions be marked as changed, so that -their problems will not be attributed erroneously to authors of previous versions. - -Some devices are designed to deny users access to install or run modified -versions of the software inside them, although the manufacturer can do so. -This is fundamentally incompatible with the aim of protecting users' freedom -to change the software. The systematic pattern of such abuse occurs in the -area of products for individuals to use, which is precisely where it is most -unacceptable. Therefore, we have designed this version of the GPL to prohibit -the practice for those products. If such problems arise substantially in other -domains, we stand ready to extend this provision to those domains in future -versions of the GPL, as needed to protect the freedom of users. - -Finally, every program is threatened constantly by software patents. States -should not allow patents to restrict development and use of software on general-purpose -computers, but in those that do, we wish to avoid the special danger that -patents applied to a free program could make it effectively proprietary. To -prevent this, the GPL assures that patents cannot be used to render the program -non-free. - -The precise terms and conditions for copying, distribution and modification -follow. - -TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - -"Copyright" also means copyright-like laws that apply to other kinds of works, -such as semiconductor masks. - -"The Program" refers to any copyrightable work licensed under this License. -Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals -or organizations. - -To "modify" a work means to copy from or adapt all or part of the work in -a fashion requiring copyright permission, other than the making of an exact -copy. The resulting work is called a "modified version" of the earlier work -or a work "based on" the earlier work. - -A "covered work" means either the unmodified Program or a work based on the -Program. - -To "propagate" a work means to do anything with it that, without permission, -would make you directly or secondarily liable for infringement under applicable -copyright law, except executing it on a computer or modifying a private copy. -Propagation includes copying, distribution (with or without modification), -making available to the public, and in some countries other activities as -well. - -To "convey" a work means any kind of propagation that enables other parties -to make or receive copies. Mere interaction with a user through a computer -network, with no transfer of a copy, is not conveying. - -An interactive user interface displays "Appropriate Legal Notices" to the -extent that it includes a convenient and prominently visible feature that -(1) displays an appropriate copyright notice, and (2) tells the user that -there is no warranty for the work (except to the extent that warranties are -provided), that licensees may convey the work under this License, and how -to view a copy of this License. If the interface presents a list of user commands -or options, such as a menu, a prominent item in the list meets this criterion. - - 1. Source Code. - -The "source code" for a work means the preferred form of the work for making -modifications to it. "Object code" means any non-source form of a work. - -A "Standard Interface" means an interface that either is an official standard -defined by a recognized standards body, or, in the case of interfaces specified -for a particular programming language, one that is widely used among developers -working in that language. - -The "System Libraries" of an executable work include anything, other than -the work as a whole, that (a) is included in the normal form of packaging -a Major Component, but which is not part of that Major Component, and (b) -serves only to enable use of the work with that Major Component, or to implement -a Standard Interface for which an implementation is available to the public -in source code form. A "Major Component", in this context, means a major essential -component (kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to produce -the work, or an object code interpreter used to run it. - -The "Corresponding Source" for a work in object code form means all the source -code needed to generate, install, and (for an executable work) run the object -code and to modify the work, including scripts to control those activities. -However, it does not include the work's System Libraries, or general-purpose -tools or generally available free programs which are used unmodified in performing -those activities but which are not part of the work. For example, Corresponding -Source includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically linked -subprograms that the work is specifically designed to require, such as by -intimate data communication or control flow between those subprograms and -other parts of the work. - -The Corresponding Source need not include anything that users can regenerate -automatically from other parts of the Corresponding Source. - - The Corresponding Source for a work in source code form is that same work. - - 2. Basic Permissions. - -All rights granted under this License are granted for the term of copyright -on the Program, and are irrevocable provided the stated conditions are met. -This License explicitly affirms your unlimited permission to run the unmodified -Program. The output from running a covered work is covered by this License -only if the output, given its content, constitutes a covered work. This License -acknowledges your rights of fair use or other equivalent, as provided by copyright -law. - -You may make, run and propagate covered works that you do not convey, without -conditions so long as your license otherwise remains in force. You may convey -covered works to others for the sole purpose of having them make modifications -exclusively for you, or provide you with facilities for running those works, -provided that you comply with the terms of this License in conveying all material -for which you do not control copyright. Those thus making or running the covered -works for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of your copyrighted -material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the conditions -stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - -No covered work shall be deemed part of an effective technological measure -under any applicable law fulfilling obligations under article 11 of the WIPO -copyright treaty adopted on 20 December 1996, or similar laws prohibiting -or restricting circumvention of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention -of technological measures to the extent such circumvention is effected by -exercising rights under this License with respect to the covered work, and -you disclaim any intention to limit operation or modification of the work -as a means of enforcing, against the work's users, your or third parties' -legal rights to forbid circumvention of technological measures. - - 4. Conveying Verbatim Copies. - -You may convey verbatim copies of the Program's source code as you receive -it, in any medium, provided that you conspicuously and appropriately publish -on each copy an appropriate copyright notice; keep intact all notices stating -that this License and any non-permissive terms added in accord with section -7 apply to the code; keep intact all notices of the absence of any warranty; -and give all recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you -may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - -You may convey a work based on the Program, or the modifications to produce -it from the Program, in the form of source code under the terms of section -4, provided that you also meet all of these conditions: - -a) The work must carry prominent notices stating that you modified it, and -giving a relevant date. - -b) The work must carry prominent notices stating that it is released under -this License and any conditions added under section 7. This requirement modifies -the requirement in section 4 to "keep intact all notices". - -c) You must license the entire work, as a whole, under this License to anyone -who comes into possession of a copy. This License will therefore apply, along -with any applicable section 7 additional terms, to the whole of the work, -and all its parts, regardless of how they are packaged. This License gives -no permission to license the work in any other way, but it does not invalidate -such permission if you have separately received it. - -d) If the work has interactive user interfaces, each must display Appropriate -Legal Notices; however, if the Program has interactive interfaces that do -not display Appropriate Legal Notices, your work need not make them do so. - -A compilation of a covered work with other separate and independent works, -which are not by their nature extensions of the covered work, and which are -not combined with it such as to form a larger program, in or on a volume of -a storage or distribution medium, is called an "aggregate" if the compilation -and its resulting copyright are not used to limit the access or legal rights -of the compilation's users beyond what the individual works permit. Inclusion -of a covered work in an aggregate does not cause this License to apply to -the other parts of the aggregate. - - 6. Conveying Non-Source Forms. - -You may convey a covered work in object code form under the terms of sections -4 and 5, provided that you also convey the machine-readable Corresponding -Source under the terms of this License, in one of these ways: - -a) Convey the object code in, or embodied in, a physical product (including -a physical distribution medium), accompanied by the Corresponding Source fixed -on a durable physical medium customarily used for software interchange. - -b) Convey the object code in, or embodied in, a physical product (including -a physical distribution medium), accompanied by a written offer, valid for -at least three years and valid for as long as you offer spare parts or customer -support for that product model, to give anyone who possesses the object code -either (1) a copy of the Corresponding Source for all the software in the -product that is covered by this License, on a durable physical medium customarily -used for software interchange, for a price no more than your reasonable cost -of physically performing this conveying of source, or (2) access to copy the -Corresponding Source from a network server at no charge. - -c) Convey individual copies of the object code with a copy of the written -offer to provide the Corresponding Source. This alternative is allowed only -occasionally and noncommercially, and only if you received the object code -with such an offer, in accord with subsection 6b. - -d) Convey the object code by offering access from a designated place (gratis -or for a charge), and offer equivalent access to the Corresponding Source -in the same way through the same place at no further charge. You need not -require recipients to copy the Corresponding Source along with the object -code. If the place to copy the object code is a network server, the Corresponding -Source may be on a different server (operated by you or a third party) that -supports equivalent copying facilities, provided you maintain clear directions -next to the object code saying where to find the Corresponding Source. Regardless -of what server hosts the Corresponding Source, you remain obligated to ensure -that it is available for as long as needed to satisfy these requirements. - -e) Convey the object code using peer-to-peer transmission, provided you inform -other peers where the object code and Corresponding Source of the work are -being offered to the general public at no charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from -the Corresponding Source as a System Library, need not be included in conveying -the object code work. - -A "User Product" is either (1) a "consumer product", which means any tangible -personal property which is normally used for personal, family, or household -purposes, or (2) anything designed or sold for incorporation into a dwelling. -In determining whether a product is a consumer product, doubtful cases shall -be resolved in favor of coverage. For a particular product received by a particular -user, "normally used" refers to a typical or common use of that class of product, -regardless of the status of the particular user or of the way in which the -particular user actually uses, or expects or is expected to use, the product. -A product is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent the -only significant mode of use of the product. - -"Installation Information" for a User Product means any methods, procedures, -authorization keys, or other information required to install and execute modified -versions of a covered work in that User Product from a modified version of -its Corresponding Source. The information must suffice to ensure that the -continued functioning of the modified object code is in no case prevented -or interfered with solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically -for use in, a User Product, and the conveying occurs as part of a transaction -in which the right of possession and use of the User Product is transferred -to the recipient in perpetuity or for a fixed term (regardless of how the -transaction is characterized), the Corresponding Source conveyed under this -section must be accompanied by the Installation Information. But this requirement -does not apply if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has been installed -in ROM). - -The requirement to provide Installation Information does not include a requirement -to continue to provide support service, warranty, or updates for a work that -has been modified or installed by the recipient, or for the User Product in -which it has been modified or installed. Access to a network may be denied -when the modification itself materially and adversely affects the operation -of the network or violates the rules and protocols for communication across -the network. - -Corresponding Source conveyed, and Installation Information provided, in accord -with this section must be in a format that is publicly documented (and with -an implementation available to the public in source code form), and must require -no special password or key for unpacking, reading or copying. - - 7. Additional Terms. - -"Additional permissions" are terms that supplement the terms of this License -by making exceptions from one or more of its conditions. Additional permissions -that are applicable to the entire Program shall be treated as though they -were included in this License, to the extent that they are valid under applicable -law. If additional permissions apply only to part of the Program, that part -may be used separately under those permissions, but the entire Program remains -governed by this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any -additional permissions from that copy, or from any part of it. (Additional -permissions may be written to require their own removal in certain cases when -you modify the work.) You may place additional permissions on material, added -by you to a covered work, for which you have or can give appropriate copyright -permission. - -Notwithstanding any other provision of this License, for material you add -to a covered work, you may (if authorized by the copyright holders of that -material) supplement the terms of this License with terms: - -a) Disclaiming warranty or limiting liability differently from the terms of -sections 15 and 16 of this License; or - -b) Requiring preservation of specified reasonable legal notices or author -attributions in that material or in the Appropriate Legal Notices displayed -by works containing it; or - -c) Prohibiting misrepresentation of the origin of that material, or requiring -that modified versions of such material be marked in reasonable ways as different -from the original version; or - -d) Limiting the use for publicity purposes of names of licensors or authors -of the material; or - -e) Declining to grant rights under trademark law for use of some trade names, -trademarks, or service marks; or - -f) Requiring indemnification of licensors and authors of that material by -anyone who conveys the material (or modified versions of it) with contractual -assumptions of liability to the recipient, for any liability that these contractual -assumptions directly impose on those licensors and authors. - -All other non-permissive additional terms are considered "further restrictions" -within the meaning of section 10. If the Program as you received it, or any -part of it, contains a notice stating that it is governed by this License -along with a term that is a further restriction, you may remove that term. -If a license document contains a further restriction but permits relicensing -or conveying under this License, you may add to a covered work material governed -by the terms of that license document, provided that the further restriction -does not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, -in the relevant source files, a statement of the additional terms that apply -to those files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form -of a separately written license, or stated as exceptions; the above requirements -apply either way. - - 8. Termination. - -You may not propagate or modify a covered work except as expressly provided -under this License. Any attempt otherwise to propagate or modify it is void, -and will automatically terminate your rights under this License (including -any patent licenses granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from -a particular copyright holder is reinstated (a) provisionally, unless and -until the copyright holder explicitly and finally terminates your license, -and (b) permanently, if the copyright holder fails to notify you of the violation -by some reasonable means prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently -if the copyright holder notifies you of the violation by some reasonable means, -this is the first time you have received notice of violation of this License -(for any work) from that copyright holder, and you cure the violation prior -to 30 days after your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses -of parties who have received copies or rights from you under this License. -If your rights have been terminated and not permanently reinstated, you do -not qualify to receive new licenses for the same material under section 10. - - 9. Acceptance Not Required for Having Copies. - -You are not required to accept this License in order to receive or run a copy -of the Program. Ancillary propagation of a covered work occurring solely as -a consequence of using peer-to-peer transmission to receive a copy likewise -does not require acceptance. However, nothing other than this License grants -you permission to propagate or modify any covered work. These actions infringe -copyright if you do not accept this License. Therefore, by modifying or propagating -a covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - -Each time you convey a covered work, the recipient automatically receives -a license from the original licensors, to run, modify and propagate that work, -subject to this License. You are not responsible for enforcing compliance -by third parties with this License. - -An "entity transaction" is a transaction transferring control of an organization, -or substantially all assets of one, or subdividing an organization, or merging -organizations. If propagation of a covered work results from an entity transaction, -each party to that transaction who receives a copy of the work also receives -whatever licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the Corresponding -Source of the work from the predecessor in interest, if the predecessor has -it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights -granted or affirmed under this License. For example, you may not impose a -license fee, royalty, or other charge for exercise of rights granted under -this License, and you may not initiate litigation (including a cross-claim -or counterclaim in a lawsuit) alleging that any patent claim is infringed -by making, using, selling, offering for sale, or importing the Program or -any portion of it. - - 11. Patents. - -A "contributor" is a copyright holder who authorizes use under this License -of the Program or a work on which the Program is based. The work thus licensed -is called the contributor's "contributor version". - -A contributor's "essential patent claims" are all patent claims owned or controlled -by the contributor, whether already acquired or hereafter acquired, that would -be infringed by some manner, permitted by this License, of making, using, -or selling its contributor version, but do not include claims that would be -infringed only as a consequence of further modification of the contributor -version. For purposes of this definition, "control" includes the right to -grant patent sublicenses in a manner consistent with the requirements of this -License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent -license under the contributor's essential patent claims, to make, use, sell, -offer for sale, import and otherwise run, modify and propagate the contents -of its contributor version. - -In the following three paragraphs, a "patent license" is any express agreement -or commitment, however denominated, not to enforce a patent (such as an express -permission to practice a patent or covenant not to sue for patent infringement). -To "grant" such a patent license to a party means to make such an agreement -or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the -Corresponding Source of the work is not available for anyone to copy, free -of charge and under the terms of this License, through a publicly available -network server or other readily accessible means, then you must either (1) -cause the Corresponding Source to be so available, or (2) arrange to deprive -yourself of the benefit of the patent license for this particular work, or -(3) arrange, in a manner consistent with the requirements of this License, -to extend the patent license to downstream recipients. "Knowingly relying" -means you have actual knowledge that, but for the patent license, your conveying -the covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that country -that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, -you convey, or propagate by procuring conveyance of, a covered work, and grant -a patent license to some of the parties receiving the covered work authorizing -them to use, propagate, modify or convey a specific copy of the covered work, -then the patent license you grant is automatically extended to all recipients -of the covered work and works based on it. - -A patent license is "discriminatory" if it does not include within the scope -of its coverage, prohibits the exercise of, or is conditioned on the non-exercise -of one or more of the rights that are specifically granted under this License. -You may not convey a covered work if you are a party to an arrangement with -a third party that is in the business of distributing software, under which -you make payment to the third party based on the extent of your activity of -conveying the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory patent -license (a) in connection with copies of the covered work conveyed by you -(or copies made from those copies), or (b) primarily for and in connection -with specific products or compilations that contain the covered work, unless -you entered into that arrangement, or that patent license was granted, prior -to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied -license or other defenses to infringement that may otherwise be available -to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - -If conditions are imposed on you (whether by court order, agreement or otherwise) -that contradict the conditions of this License, they do not excuse you from -the conditions of this License. If you cannot convey a covered work so as -to satisfy simultaneously your obligations under this License and any other -pertinent obligations, then as a consequence you may not convey it at all. -For example, if you agree to terms that obligate you to collect a royalty -for further conveying from those to whom you convey the Program, the only -way you could satisfy both those terms and this License would be to refrain -entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - -Notwithstanding any other provision of this License, you have permission to -link or combine any covered work with a work licensed under version 3 of the -GNU Affero General Public License into a single combined work, and to convey -the resulting work. The terms of this License will continue to apply to the -part which is the covered work, but the special requirements of the GNU Affero -General Public License, section 13, concerning interaction through a network -will apply to the combination as such. - - 14. Revised Versions of this License. - -The Free Software Foundation may publish revised and/or new versions of the -GNU General Public License from time to time. Such new versions will be similar -in spirit to the present version, but may differ in detail to address new -problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies -that a certain numbered version of the GNU General Public License "or any -later version" applies to it, you have the option of following the terms and -conditions either of that numbered version or of any later version published -by the Free Software Foundation. If the Program does not specify a version -number of the GNU General Public License, you may choose any version ever -published by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future versions of -the GNU General Public License can be used, that proxy's public statement -of acceptance of a version permanently authorizes you to choose that version -for the Program. - -Later license versions may give you additional or different permissions. However, -no additional obligations are imposed on any author or copyright holder as -a result of your choosing to follow a later version. - - 15. Disclaimer of Warranty. - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE -LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM -PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR -CORRECTION. - - 16. Limitation of Liability. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL -ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM -AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, -INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO -USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED -INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE -PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER -PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - -If the disclaimer of warranty and limitation of liability provided above cannot -be given local legal effect according to their terms, reviewing courts shall -apply local law that most closely approximates an absolute waiver of all civil -liability in connection with the Program, unless a warranty or assumption -of liability accompanies a copy of the Program in return for a fee. END OF -TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible -use to the public, the best way to achieve this is to make it free software -which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach -them to the start of each source file to most effectively state the exclusion -of warranty; and each file should have at least the "copyright" line and a -pointer to where the full notice is found. - - - -Copyright (C) - -This program is free software: you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation, either version 3 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - -If the program does terminal interaction, make it output a short notice like -this when it starts in an interactive mode: - - Copyright (C) - -This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - -This is free software, and you are welcome to redistribute it under certain -conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands might -be different; for a GUI interface, you would use an "about box". - -You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. For -more information on this, and how to apply and follow the GNU GPL, see . - -The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General Public -License instead of this License. But first, please read . diff --git a/README.md b/README.md index 5530a3b..a4baa30 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,8 @@ -# birbnetes-tdk-latex +# knative-report-latex +2019 Szakdolgozat Latex +[![Build Status](https://travis-ci.com/tormachris/knative-report-latex.svg?branch=master)](https://travis-ci.com/tormachris/knative-report-latex) + +Drone: + +[![Build Status](https://drone.kmlabz.com/api/badges/tormakris/knative-report-latex/status.svg)](https://drone.kmlabz.com/tormakris/knative-report-latex) diff --git a/pdf/.gitignore b/pdf/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/pdf/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/src/.kile/thesis.kilepr.gui b/src/.kile/thesis.kilepr.gui new file mode 100644 index 0000000..f62c6c9 --- /dev/null +++ b/src/.kile/thesis.kilepr.gui @@ -0,0 +1,240 @@ +[General] +kile_livePreviewEnabled=true +kile_livePreviewStatusUserSpecified=true +kile_livePreviewTool=LivePreview-XeLaTeX +lastDocument=content/results.tex + +[document-settings,item:../../thesis-template-latex/src/thesis.tex] +Bookmarks= +Encoding=UTF-8 +Highlighting=LaTeX +Highlighting Set By User=false +Indentation Mode=normal +Mode=LaTeX +Mode Set By User=false + +[document-settings,item:content/abstract.tex] +Bookmarks= +Encoding=UTF-8 +Highlighting=LaTeX +Highlighting Set By User=false +Indentation Mode=normal +Mode=LaTeX +Mode Set By User=false + +[document-settings,item:content/acknowledgement.tex] +Bookmarks= +Encoding=UTF-8 +Highlighting=LaTeX +Highlighting Set By User=false +Indentation Mode=normal +Mode=LaTeX +Mode Set By User=false + +[document-settings,item:content/appendices.tex] +Bookmarks= +Encoding=UTF-8 +Highlighting=LaTeX +Highlighting Set By User=false +Indentation Mode=normal +Mode=LaTeX +Mode Set By User=false + +[document-settings,item:content/closing.tex] +Bookmarks= +Encoding=UTF-8 +Highlighting=LaTeX +Highlighting Set By User=false +Indentation Mode=normal +Mode=LaTeX +Mode Set By User=false + +[document-settings,item:content/create-functions.tex] +Bookmarks= +Encoding=UTF-8 +Highlighting=LaTeX +Highlighting Set By User=false +Indentation Mode=normal +Mode=LaTeX +Mode Set By User=false + +[document-settings,item:content/introduction.tex] +Bookmarks= +Encoding=UTF-8 +Highlighting=LaTeX +Highlighting Set By User=false +Indentation Mode=normal +Mode=LaTeX +Mode Set By User=false + +[document-settings,item:content/preparation.tex] +Bookmarks= +Encoding=UTF-8 +Highlighting=LaTeX +Highlighting Set By User=false +Indentation Mode=normal +Mode=LaTeX +Mode Set By User=false + +[document-settings,item:content/results.tex] +Bookmarks= +Encoding=UTF-8 +Highlighting=LaTeX +Highlighting Set By User=false +Indentation Mode=normal +Mode=LaTeX +Mode Set By User=false + +[document-settings,item:content/theory.tex] +Bookmarks= +Encoding=UTF-8 +Highlighting=LaTeX +Highlighting Set By User=false +Indentation Mode=normal +Mode=LaTeX +Mode Set By User=false + +[document-settings,item:thesis.tex] +Bookmarks= +Encoding=UTF-8 +Highlighting=LaTeX +Highlighting Set By User=false +Indentation Mode=normal +Mode=LaTeX +Mode Set By User=false + +[item:../../thesis-template-latex/src/thesis.tex] +open=true +order=0 + +[item:content/abstract.tex] +open=false +order=0 + +[item:content/acknowledgement.tex] +open=true +order=3 + +[item:content/appendices.tex] +open=true +order=2 + +[item:content/closing.tex] +open=false +order=6 + +[item:content/create-functions.tex] +open=false +order=4 + +[item:content/introduction.tex] +open=false +order=1 + +[item:content/preparation.tex] +open=false +order=3 + +[item:content/results.tex] +open=true +order=1 + +[item:content/theory.tex] +open=true +order=0 + +[item:thesis.kilepr] +open=false +order=-1 + +[item:thesis.tex] +open=false +order=8 + +[view-settings,view=0,item:../../thesis-template-latex/src/thesis.tex] +CursorColumn=32 +CursorLine=37 +Dynamic Word Wrap=false +JumpList= +TextFolding=[] +ViMarks= + +[view-settings,view=0,item:content/abstract.tex] +CursorColumn=141 +CursorLine=10 +Dynamic Word Wrap=true +JumpList= +TextFolding=[] +ViMarks=.,1,0,[,1,0,],1,0 + +[view-settings,view=0,item:content/acknowledgement.tex] +CursorColumn=0 +CursorLine=7 +Dynamic Word Wrap=false +JumpList= +TextFolding=[] +ViMarks=.,8,233,[,8,233,],8,233 + +[view-settings,view=0,item:content/appendices.tex] +CursorColumn=37 +CursorLine=6 +Dynamic Word Wrap=false +JumpList= +TextFolding=[] +ViMarks=.,181,0,[,181,0,],181,9 + +[view-settings,view=0,item:content/closing.tex] +CursorColumn=29 +CursorLine=4 +Dynamic Word Wrap=true +JumpList= +TextFolding=[] +ViMarks=.,4,28,[,4,19,],4,28 + +[view-settings,view=0,item:content/create-functions.tex] +CursorColumn=121 +CursorLine=1 +Dynamic Word Wrap=true +JumpList= +TextFolding=[] +ViMarks=.,34,55,[,34,38,],34,57 + +[view-settings,view=0,item:content/introduction.tex] +CursorColumn=24 +CursorLine=5 +Dynamic Word Wrap=true +JumpList= +TextFolding=[] +ViMarks=.,1,0,[,1,0,],1,0 + +[view-settings,view=0,item:content/preparation.tex] +CursorColumn=866 +CursorLine=125 +Dynamic Word Wrap=true +JumpList= +TextFolding=[] +ViMarks=.,123,241,[,123,232,],123,241 + +[view-settings,view=0,item:content/results.tex] +CursorColumn=0 +CursorLine=195 +Dynamic Word Wrap=true +JumpList= +TextFolding=[] +ViMarks=.,131,180,[,131,177,],131,180 + +[view-settings,view=0,item:content/theory.tex] +CursorColumn=404 +CursorLine=125 +Dynamic Word Wrap=true +JumpList= +TextFolding=[] +ViMarks=.,66,39,[,66,39,],66,39 + +[view-settings,view=0,item:thesis.tex] +CursorColumn=22 +CursorLine=46 +Dynamic Word Wrap=false +JumpList= +TextFolding=[] +ViMarks=.,12,39,[,12,39,],12,39 diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..28b5e34 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,68 @@ +DOCUMENT=thesis +#MODE=-interaction=batchmode + +all: clean xelatex + echo + +xelatex: compile_xelatex + mv $(DOCUMENT)-xelatex.pdf ../pdf/$(DOCUMENT).pdf + +compile_xelatex: + xelatex $(MODE) $(DOCUMENT) + bibtex $(DOCUMENT) + xelatex $(MODE) $(DOCUMENT) + xelatex $(MODE) $(DOCUMENT) + mv $(DOCUMENT).pdf $(DOCUMENT)-xelatex.pdf + +pdflatex: compile_pdflatex + mv $(DOCUMENT)-pdflatex.pdf ../pdf/$(DOCUMENT).pdf + +compile_pdflatex: + pdflatex $(MODE) $(DOCUMENT) + bibtex $(DOCUMENT) + pdflatex $(MODE) $(DOCUMENT) + pdflatex $(MODE) $(DOCUMENT) + mv $(DOCUMENT).pdf $(DOCUMENT)-pdflatex.pdf + +lualatex: compile_lualatex + mv $(DOCUMENT)-lualatex.pdf ../pdf/$(DOCUMENT).pdf + +compile_lualatex: + lualatex $(MODE) $(DOCUMENT) + bibtex $(DOCUMENT) + lualatex $(MODE) $(DOCUMENT) + lualatex $(MODE) $(DOCUMENT) + mv $(DOCUMENT).pdf $(DOCUMENT)-lualatex.pdf + +switch_to_hungarian: + sed -i "s|^\\\input{include/thesis-en}|%\\\input{include/thesis-en}|" $(DOCUMENT).tex + sed -i "s|^%\\\input{include/thesis-hu}|\\\input{include/thesis-hu}|" $(DOCUMENT).tex + +test_hu: + ${MAKE} clean compile_xelatex + ${MAKE} clean compile_pdflatex + ${MAKE} clean compile_lualatex + mv $(DOCUMENT)-xelatex.pdf ../pdf/$(DOCUMENT)-xelatex-hu.pdf + mv $(DOCUMENT)-pdflatex.pdf ../pdf/$(DOCUMENT)-pdflatex-hu.pdf + mv $(DOCUMENT)-lualatex.pdf ../pdf/$(DOCUMENT)-lualatex-hu.pdf + +switch_to_english: + sed -i "s|^\\\input{include/thesis-hu}|%\\\input{include/thesis-hu}|" $(DOCUMENT).tex + sed -i "s|^%\\\input{include/thesis-en}|\\\input{include/thesis-en}|" $(DOCUMENT).tex + +test_en: + ${MAKE} switch_to_english + ${MAKE} clean compile_xelatex + ${MAKE} clean compile_pdflatex + ${MAKE} clean compile_lualatex + mv $(DOCUMENT)-xelatex.pdf ../pdf/$(DOCUMENT)-xelatex-en.pdf + mv $(DOCUMENT)-pdflatex.pdf ../pdf/$(DOCUMENT)-pdflatex-en.pdf + mv $(DOCUMENT)-lualatex.pdf ../pdf/$(DOCUMENT)-lualatex-en.pdf + ${MAKE} switch_to_hungarian + +test: test_hu test_en + echo + +clean: + echo Cleaning temporary files... + rm -f *.aux *.dvi *.thm *.lof *.log *.lot *.fls *.out *.toc *.bbl *.blg diff --git a/src/bib/mybib.bib b/src/bib/mybib.bib new file mode 100644 index 0000000..23f33c6 --- /dev/null +++ b/src/bib/mybib.bib @@ -0,0 +1,402 @@ +@misc{dockervirt, + author = {Nick Janetakis}, + howpublished = {\url{https://nickjanetakis.com/blog/comparing-virtual-machines-vs-docker-containers}}, + note = {Megtekintve 2020-02-20}, + title = {Comparing Virtual Machines vs Docker Containers} +} + +@misc{docker-overview, + howpublished = {\url{https://docs.docker.com/engine/docker-overview/}}, + note = {Megtekintve 2020-02-22}, + title = {Docker overview} +} + +@misc{linux-namespaces, + howpublished = {\url{http://man7.org/linux/man-pages/man7/namespaces.7.html}}, + note = {Megtekintve 2020-02-20}, + title = {namespaces - overview of Linux namespaces} +} + +@misc{cgroups, + howpublished = {\url{https://access.redhat.com/documentation/en-us/red\_hat\_enterprise\_linux/6/html/resource\_management\_guide/ch01}}, + note = {Megtekintve 2020-02-20}, + title = {Introduction to Control Groups (Cgroups)} +} + +@misc{mikroszeviz, + author = {Farkas G{\'a}bor}, + howpublished = {\url{https://ithub.hu/blog/post/A\_microservice\_architekturarol\_diohejban/}}, + note = {Megtekintve 2020-02-23}, + title = {A microservice architekt{\'u}r{\'a}r{\'o}l di{\'o}h{\'e}jban} +} + +@misc{kubernetes-pods, + howpublished = {\url{https://kubernetes.io/docs/concepts/workloads/pods/pod/}}, + note = {Megtekintve 2020-02-21}, + title = {Pods} +} + +@misc{kubernetes-replicaset, + howpublished = {\url{https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/}}, + note = {Megtekintve 2020-02-20}, + title = {ReplicaSet} +} + +@misc{kubernetes-deployment, + howpublished = {\url{https://kubernetes.io/docs/concepts/workloads/controllers/deployment/}}, + note = {Megtekintve 2020-02-20}, + title = {Deployments} +} + +@misc{kubernetes-crd, + howpublished = {\url{https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/}}, + note = {Megtekintve 2020-02-20}, + title = {Extend the Kubernetes API with CustomResourceDefinitions} +} + +@misc{kubernetes-hpa, + howpublished = {\url{https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/}}, + note = {Megtekintve 2020-02-23}, + title = {Horizontal Pod Autoscaler} +} + +@misc{kubeless-http, + howpublished = {\url{https://kubeless.io/docs/http-triggers/}}, + note = {Megtekintve 2020-02-23}, + title = {Expose and secure Kubeless functions} +} + +@misc{kubeless-pubsub, + howpublished = {\url{https://kubeless.io/docs/pubsub-functions/}}, + note = {Megtekintve 2020-02-23}, + title = {PubSub events} +} + +@misc{kubernetes-ingress, + howpublished = {\url{https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/}}, + note = {Megtekintve 2020-02-24}, + title = {Ingress Controllers} +} + +@misc{kubernetes-nginx, + howpublished = {\url{https://kubernetes.github.io/ingress-nginx/}}, + note = {Megtekintve 2020-02-24}, + title = {NGINX Ingress Controller} +} + +@misc{github-issue-1, + howpublished = {\url{https://github.com/kubernetes-incubator/metrics-server/issues/131}}, + note = {Megtekintve 2020-02-24}, + title = {Metrics server issue with hostname resolution of kubelet and apiserver unable to communicate with metric-server clusterIP} +} + +@misc{kubeless-quickstart, + howpublished = {\url{https://kubeless.io/docs/quick-start/}}, + note = {Megtekintve 2020-02-22}, + title = {Installation} +} + +@misc{github-hey, + howpublished = {\url{https://github.com/rakyll/hey}}, + note = {Megtekintve 2020-02-21}, + title = {HTTP load generator, ApacheBench (ab) replacement, formerly known as rakyll/boom} +} + +@misc{github-wrk, + howpublished = {\url{https://github.com/wg/wrk}}, + note = {Megtekintve 2020-02-21}, + title = {Modern HTTP benchmarking tool} +} + +@misc{docker-logging, + howpublished = {\url{https://docs.docker.com/config/containers/logging/configure/}}, + note = {Megtekintve 2020-02-25}, + title = {Configure logging drivers} +} + +@misc{kubernetes-ephemeral-storage, + howpublished = {\url{https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/\#local-ephemeral-storage}}, + note = {Megtekintve 2020-02-24}, + title = {Managing Compute Resources for Containers - Local ephemeral storage} +} + +@misc{kubernetes-eviction, + howpublished = {\url{https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/\#eviction-policy}}, + note = {Megtekintve 2020-02-27}, + title = {Configure Out of Resource Handling - Eviction Policy} +} + +@misc{kubernetes-nodes, + howpublished = {\url{https://kubernetes.io/docs/concepts/architecture/nodes/}}, + note = {Megtekintve 2020-02-27}, + title = {Nodes} +} + +@misc{kubernetes-kubelet, + howpublished = {\url{https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/}}, + note = {Megtekintve 2020-02-27}, + title = {kubelet} +} + +@misc{cloud, + howpublished = {\url{https://www.ibm.com/cloud/learn/cloud-computing}}, + note = {Megtekintve 2020-02-27}, + title = {Cloud computing: A complete guide} +} + +@misc{faas, + howpublished = {\url{https://www.cloudflare.com/learning/serverless/glossary/function-as-a-service-faas/}}, + note = {Megtekintve 2020-02-23}, + title = {What Is Function as a Service (FaaS)?} +} + +@misc{saas, + howpublished = {\url{https://www.infoworld.com/article/3226386/what-is-saas-software-as-a-service-defined.html}}, + note = {Megtekintve 2020-02-21}, + title = {What is SaaS? Software-as-a-service defined} +} + +@misc{paas, + howpublished = {\url{https://www.bmc.com/blogs/saas-vs-paas-vs-iaas-whats-the-difference-and-how-to-choose/}}, + note = {Megtekintve 2020-02-21}, + title = {SaaS vs PaaS vs IaaS: What{\rq}s The Difference and How To Choose} +} + +@misc{iaas, + howpublished = {\url{https://www.techradar.com/news/what-is-infrastructure-as-a-service}}, + note = {Megtekintve 2020-02-21}, + title = {What is Infrastructure-as-a-Service? Everything you need to know} +} + +@misc{os-virt, + howpublished = {\url{https://www.w3schools.in/cloud-virtualization/os-virtualization/}}, + note = {Megtekintve 2020-02-22}, + title = {Operating System (OS) Virtualization} +} + +@misc{docker-layers, + howpublished = {\url{https://medium.com/@jessgreb01/digging-into-docker-layers-c22f948ed612}}, + note = {Megtekintve 2020-02-21}, + title = {Digging into Docker layers} +} + +@misc{kubernetes-runtimes, + howpublished = {\url{https://kubernetes.io/docs/setup/production-environment/container-runtimes/}}, + note = {Megtekintve 2020-02-21}, + title = {Container runtimes} +} + +@misc{kubernetes-concepts, + howpublished = {\url{https://kubernetes.io/docs/concepts/}}, + note = {Megtekintve 2020-02-20}, + title = {Concepts} +} + +@misc{kube-apiserver, + howpublished = {\url{https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/}}, + note = {Megtekintve 2020-02-20}, + title = {kube-apiserver} +} + +@misc{etcd, + howpublished = {\url{https://etcd.io/docs/v3.4.0/learning/data\_model/}}, + note = {Megtekintve 2020-02-20}, + title = {Data model} +} + +@misc{kubernetes-api, + howpublished = {\url{https://kubernetes.io/docs/concepts/overview/kubernetes-api/}}, + note = {Megtekintve 2020-02-20}, + title = {The Kubernetes API} +} + +@misc{kuebrnetes-controller, + howpublished = {\url{https://kubernetes.io/docs/concepts/architecture/controller/}}, + note = {Megtekintve 2020-02-20}, + title = {Controllers} +} + +@misc{kubernetes-node-controller, + howpublished = {\url{https://unofficial-kubernetes.readthedocs.io/en/latest/concepts/nodes/node/\#node-controller}}, + note = {Megtekintve 2020-02-20}, + title = {Node - Node Controller} +} + +@misc{kuebrnetes-components, + howpublished = {\url{https://kubernetes.io/docs/concepts/overview/components/}}, + note = {Megtekintve 2020-02-20}, + title = {Kubernetes Components} +} + +@misc{kubernetes-scheduler, + howpublished = {\url{https://kubernetes.io/docs/concepts/scheduling/kube-scheduler/}}, + note = {Megtekintve 2020-02-20}, + title = {Kubernetes Scheduler} +} + +@misc{kubernetes-kube-proxy, + howpublished = {\url{https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/}}, + note = {Megtekintve 2020-02-20}, + title = {kube-proxy} +} + +@misc{kubernetes-service, + howpublished = {\url{https://kubernetes.io/docs/concepts/services-networking/service/}}, + note = {Megtekintve 2020-02-21}, + title = {Service} +} + +@misc{kubernetes-volume, + howpublished = {\url{https://kubernetes.io/docs/concepts/storage/volumes/}}, + note = {Megtekintve 2020-02-21}, + title = {Volumes} +} + +@misc{kubernetes-ingress-resource, + howpublished = {\url{https://kubernetes.io/docs/concepts/services-networking/ingress/}}, + note = {Megtekintve 2020-02-25}, + title = {Ingress} +} + +@misc{kubeless, + howpublished = {\url{https://itnext.io/kubeless-kubernetes-native-serverless-framework-3d0f96e03add}}, + note = {Megtekintve 2020-02-25}, + title = {Kubeless --- Kubernetes Native Serverless Framework} +} + +@misc{kubeless-api-deploy, + howpublished = {\url{https://kubeless.io/docs/advanced-function-deployment/}}, + note = {Megtekintve 2020-02-25}, + title = {Deploying Kubeless Functions using Kubernetes API} +} + +@misc{kubeless-build, + howpublished = {\url{https://kubeless.io/docs/building-functions/}}, + note = {Megtekintve 2020-02-25}, + title = {Build process for functions} +} + +@misc{istio-service-mesh, + howpublished = {\url{https://istio.io/docs/concepts/what-is-istio/}}, + note = {Megtekintve 2020-02-26}, + title = {What is Istio?} +} + +@misc{istio-observer, + howpublished = {\url{https://istio.io/docs/concepts/observability/}}, + note = {Megtekintve 2020-02-26}, + title = {Observability} +} + +@misc{istio-mgmt, + howpublished = {\url{https://istio.io/docs/concepts/traffic-management/}}, + note = {Megtekintve 2020-02-26}, + title = {Traffic Management} +} + +@misc{knative, + howpublished = {\url{https://containerjournal.com/topics/container-management/what-is-knative-and-what-can-it-do-for-you/}}, + note = {Megtekintve 2020-02-26}, + title = {What is Knative, and What Can It Do for You?} +} + +@misc{knative-serving, + howpublished = {\url{https://knative.dev/docs/serving/}}, + note = {Megtekintve 2020-02-27}, + title = {Knative Serving} +} + +@misc{knative-eventing, + howpublished = {\url{https://knative.dev/docs/eventing/}}, + note = {Megtekintve 2020-02-27}, + title = {Knative Eventing} +} + +@misc{knative-thoughts, + howpublished = {\url{https://searchitoperations.techtarget.com/news/252469607/Knative-serverless-Kubernetes-bypasses-FaaS-to-revive-PaaS}}, + note = {Megtekintve 2020-02-27}, + title = {Knative serverless Kubernetes bypasses FaaS to revive PaaS} +} + +@misc{knative-gateweay, + howpublished = {\url{https://knative.dev/v0.9-docs/serving/samples/knative-routing-go/}}, + note = {Megtekintve 2020-02-27}, + title = {Routing across multiple Knative services - Go} +} + +@misc{knative-autoscaler, + howpublished = {\url{https://knative.dev/docs/serving/configuring-the-autoscaler/}}, + note = {Megtekintve 2020-02-27}, + title = {Configuring the Autoscaler} +} + +@misc{knative-autoscaler-component, + howpublished = {\url{https://github.com/knative/serving/blob/master/docs/scaling/DEVELOPMENT.md}}, + note = {Megtekintve 2020-02-24}, + title = {Autoscaling} +} + +@misc{knative-gloo, + howpublished = {\url{https://medium.com/solo-io/gloo-by-solo-io-is-the-first-alternative-to-istio-on-knative-324753586f3a}}, + note = {Megtekintve 2020-02-25}, + title = {Gloo, by Solo.io, is the first alternative to Istio on Knative} +} + +@misc{knative-monitoring, + howpublished = {\url{https://github.com/knative/docs/blob/master/docs/serving/accessing-metrics.md}}, + note = {Megtekintve 2020-02-22}, + title = {Accessing Metrics} +} + +@misc{knative-crd, + howpublished = {\url{https://github.com/knative/serving/blob/master/docs/spec/overview.md}}, + note = {Megtekintve 2020-02-22}, + title = {Resource Types} +} + +@misc{cloudlab, + howpublished = {\url{https://cloudlab.us/technology.php}}, + note = {Megtekintve 2020-01-29}, + title = {Cloudlab - Software Technology} +} + +@misc{influxdb-performance, + author = {Syeda Noor Zehra Naqvi and Sofia Yfantidou}, + howpublished = {\url{https://cs.ulb.ac.be/public/\_media/teaching/influxdb\_2017.pdf}}, + note = {Megtekintve 2020-03-29}, + title = {Time Series Databases and InfluxDB} +} + +@misc{microservices-apply, + howpublished = {\url{https://microservices.io/articles/applying.html}}, + note = {Megtekintve 2020-02-29}, + title = {Applying the microservice architecture pattern language} +} + +@misc{microservices-intro, + author = {Chris Richardson}, + howpublished = {\url{https://www.nginx.com/blog/introduction-to-microservices/}}, + note = {Megtekintve 2020-02-10}, + title = {Introduction to Microservices} +} + +@misc{microservices-apigateway, + author = {Chris Richardson}, + howpublished = {\url{https://www.nginx.com/blog/building-microservices-using-an-api-gateway/}}, + note = {Megtekintve 2020-03-20}, + title = {Building Microservices: Using an API Gateway} +} + +@misc{microservices-messagequeue, + author = {Alexander Nnakwue}, + howpublished = {\url{https://blog.logrocket.com/understanding-message-queuing-systems-using-rabbitmq/}}, + note = {Megtekintve 2020-03-10}, + title = {Understanding message queuing systems using RabbitMQ} +} + +@misc{microservices-timeseriesdb, + howpublished = {\url{https://www.influxdata.com/time-series-database/}}, + note = {Megtekintve 2020-02-28}, + title = {Time series database (TSDB) explained} +} + diff --git a/src/content/abstract.tex b/src/content/abstract.tex new file mode 100644 index 0000000..84baf8d --- /dev/null +++ b/src/content/abstract.tex @@ -0,0 +1,37 @@ +\pagenumbering{roman} +\setcounter{page}{1} + +\selecthungarian + +%---------------------------------------------------------------------------- +% Abstract in Hungarian +%---------------------------------------------------------------------------- +\chapter*{Kivonat}\addcontentsline{toc}{chapter}{Kivonat} + +Napjainkban a mezőgazdaságban egyre elterjedtebbek a dolgok internetére (Internet of Things – IoT) épülő megoldások, ezek viszont nagy mennyiségű adatot generálnak, amelyek feldolgozása tradicionális rendszerekkel nehézkes. Erre a problémára tud megoldást nyújtani egy jól skálázódó felhő-natív adatfeldolgozó és elemző rendszer, amelynek tervezése és megvalósítása több kihívást is rejt magában. +Kártevő madarak hang alapján történő gyors és automatikus azonosítása fontos feladat, ugyanis például a seregélyek akár több tízmillió forint kárt is képesek okozni egy nagyobb szőlőbirtoknak. Dolgozatunkban seregélyek hang alapján történő azonosítása és riasztása a kitűzött cél, ezzel segítve a szőlősgazdákat. +Az ilyen rendszerek esetében fontos elvárás a közel valós idejű reakció, különben nem képes hatékonyan támogatni a megfigyelni vagy felügyelni kívánt folyamatokat. Ezért a rendszer komponenseinek telepítése és elhelyezése során biztosítani kell, hogy egy adatpont átfutási ideje és az egyes komponensek válaszideje is bizonyos keretek között maradjon. A rendszer tervezése során további lehetőségeket vetnek fel az az edge cloud megoldások. +Dolgozatunk keretein belül egy ilyen rendszer tervezését és fejlesztését mutatjuk be. Ehhez elkészítettem a rendszer architektúrájának tervét, a komponensek közötti interfészeket. A rendszer kidolgozása során számos általános problémát megoldó komponens készült el, valamint több, a seregélyek hangját felismerő elemet is felhasználtam. Ezen az elkészült rendszeren méréseket végeztünk, hogy annak változó méretű és jellegű terhelés alatti működését felmérjük. Az elvégzett méréseket és azok eredményeinek analízisét automatizáljuk, felgyorsítva ezek értelmezését. +A tervezés és fejlesztés során cél kizárólag nyílt forráskódú és szabadon elérhető komponensek, valamint szolgáltatófüggetlen Kubernetes technológiák használata. Így a rendszer felhő szolgáltatók között gyorsan és könnyedén hordozható marad, de komolyabb nehézségek nélkül telepíthető saját Kubernetes fürtbe is. + +\vfill +\selectenglish + + +%---------------------------------------------------------------------------- +% Abstract in English +%---------------------------------------------------------------------------- +\chapter*{Abstract}\addcontentsline{toc}{chapter}{Abstract} + +Nowadays many smart agricultural solutions leverage the novel mechanisms of Internet of Things (IoT), which in turn generate large volume of data that cannot be processed efficiently with legacy data processing methods. This shortcoming can be successfully addressed by cloud native data processing and analytics systems, but due to their complexity, the design and deployment of such systems pose their own challenges. +Fast and automatic recognition of pest birds is important as they can cause great financial harm to larger vineyards. In our work we focused on the detection and deterrence of Sturnus Vulgaris, one such pest bird. +The IoT systems we discuss require tight, near instant response times, otherwise they cannot efficiently support the processes they are supposed to monitor or control. To ensure this, during installation and scheduling of each component the round-trip time of datapoints and the response time of each component must be kept within certain limits. When planning such systems edge cloud solutions give developers tools to achieve this. As a part of our paper we discuss the design and development of such systems. To do this we designed and developed such a system from the ground up and measured its behaviour under loads of varying size and nature. We automated these measurements and their analysis to speed up further research. +During design and development, we had a goal to exclusively use free and open source components as well as a provider-independent Kubernetes distribution. By doing this our system can be moved between cloud providers with relative ease and it may also be deployed to a self-hosted Kubernetes cluster quite easily. + +\vfill +\selectthesislanguage + +\clearpage +\newcounter{romanPage} +\setcounter{romanPage}{\value{page}} +\stepcounter{romanPage} diff --git a/src/content/acknowledgement.tex b/src/content/acknowledgement.tex new file mode 100644 index 0000000..e01ea2e --- /dev/null +++ b/src/content/acknowledgement.tex @@ -0,0 +1,9 @@ +%---------------------------------------------------------------------------- +\chapter*{\koszonetnyilvanitas}\addcontentsline{toc}{chapter}{\koszonetnyilvanitas} +%---------------------------------------------------------------------------- + +K\"osz\"on\"om a konzulensemnek a seg\'itők\'esz hozz\'a\'all\'as\'at \'es \'utmutat\'as\'at Dr. Maliosz Markosznak. K\"osz\"on\"om sz\"uleimnek \'es a bar\'ataimnak a t\'amogat\'ast. + +A szakdolgozatban ismertetett eredmények a Budapesti Műszaki és Gazdaságtudományi Egyetem Villamosmérnöki és Informatikai Kar Balatonfüredi Hallgatói Kutatócsoport szakmai közössége keretében jöttek létre a régió gazdasági fejlődésének elősegítése érdekében. Az eredmények létrehozása során figyelembe vettük a balatonfüredi központú Rendszertudományi Innovációs Klaszter által megfogalmazott célkitűzéseket, valamint a párhuzamosan megvalósuló EFOP 4.2.1-16-2017-00021 pályázat támogatásával elnyert „BME Balatonfüredi Tudáscentrum” térségfejlesztési terveit. + +A kutatás az Európai Unió támogatásával, az Európai Szociális Alap társfinanszírozásával valósult meg (EFOP-3.6.2-16-2017-00013, Innovatív Informatikai és Infokommunikációs Megoldásokat Megalapozó Tematikus Kutatási Együttműködések). diff --git a/src/content/appendices.tex b/src/content/appendices.tex new file mode 100644 index 0000000..42df043 --- /dev/null +++ b/src/content/appendices.tex @@ -0,0 +1,209 @@ +% !TeX root = ../thesis.tex +%---------------------------------------------------------------------------- +\appendix +%---------------------------------------------------------------------------- +\chapter*{\fuggelek}\addcontentsline{toc}{chapter}{\fuggelek} +\setcounter{chapter}{\appendixnumber} +%\setcounter{equation}{0} % a fofejezet-szamlalo az angol ABC 6. betuje (F) lesz +\numberwithin{equation}{section} +\numberwithin{figure}{section} +\numberwithin{lstlisting}{section} +%\numberwithin{tabular}{section} + +\section{Knative Autoscaler napl\'o feldolgoz\'as\'at v\'egző k\'od} +\label{sec:log-analyze} +\begin{lstlisting}[label=code:log-analyze] +class LogAnalyzer(Analyzer): + def __init__(self): + super().__init__(typeof='.txt') + self.concurrencypersec = [] + self.podpersec = [] + self.start = datetime.datetime.now() + self.end = datetime.datetime.now() + + def listtodict(self, inlist: list) -> dict: + it = iter(inlist) + res_dct = dict(zip(it, it)) + return res_dct + + def processfile( + self, + fname, + shouldprint: bool = False) -> dict: + dictofsecs = {} + if 'date' in fname: + return {} + with open(fname, 'r') as inputFile: + line = inputFile.readline() + while line: + try: + linedict = json.loads(line) + try: + currdate = linedict['ts'].split( + '.')[0].replace('T', ' ') + dateformatted = datetime.datetime.strptime( + currdate, '%Y-%m-%d %H:%M:%S') + if self.start < dateformatted < self.end: + message = linedict['msg'] + messagelist = re.split('[ =]', message) + messagedict = self.listtodict(messagelist) + messagedict['ts'] = dateformatted + if 'ObservedStableValue' in messagedict: + if messagedict['ts'] not in dictofsecs: + dictofsecs[messagedict['ts']] = { + 'pod': [], 'cc': []} + dictofsecs[messagedict['ts']]['pod'].append( + float(messagedict['PodCount'])) + dictofsecs[messagedict['ts']]['cc'].append( + float(messagedict['ObservedStableValue'])) + except Exception as exception: + print(exception) + except json.JSONDecodeError: + continue + finally: + line = inputFile.readline() + return dictofsecs + + def readconfigdates(self, directory='.'): + dates = [] + with open(directory + "/dates.txt", 'r') as inputFile: + line = inputFile.readline().rstrip() + currline = 0 + while line: + dateformatted = datetime.datetime.strptime( + line, '%Y-%m-%d %H:%M:%S') + dates.append(dateformatted) + line = inputFile.readline().rstrip() + currline += 1 + self.start = dates[0] + self.end = dates[1] + + def averagepersec( + self, + dictoftimes: dict, + shouldprint: bool = False) -> None: + for key, value in dictoftimes.items(): + pod = value['pod'] + concurrency = value['cc'] + avgpod = average(pod) + avgcc = average(concurrency) + self.podpersec.append(avgpod) + self.concurrencypersec.append(avgcc) + if shouldprint: + print(avgpod) + print(avgcc) + + def work(self, directory: str = '.') -> None: + files = super().getfiles(directory) + self.readconfigdates(directory) + filelines = {} + for afile in files: + filelines.update(self.processfile(afile)) + self.averagepersec(filelines, False) + +\end{lstlisting} + +\section{Folyamatos terhel\'est gener\'al\'o m\'er\'est v\'egző szkriptr\'eszlet Bash nyelven} +\begin{lstlisting}[label=code:bash-banchmark-for] +if [[ $* == *"--for"* ]]; then + for num in 1 2 3 4 5 6 7 8 9 10; do + echo -e "for $num\n" + if $kubeless; then + if [[ $* == *"--loadtest"* ]]; then + loadtest -k -H "Host: $function.kubeless" --rps $rps -c $connection -t $time -p "$function_firendly".body http://$kuberhost/"$function" >./data/"$function"."$num".txt + else + hey -c "$connection" -q $rps -z "$time" -m POST -o csv -host "$function.kubeless" -D "$function_friendly".body -T "application/json" http://$kuberhost/"$function" >./data/"$function"."$num".csv + fi + else + if [[ $* == *"--loadtest"* ]]; then + loadtest -k -H "Host: $function.default.example.com" --rps $rps -c $connection -t $time http://$kuberhost/ >./data/"$function"."$num".for.csv + else + hey -c "$connection" -q $rps -z "$time" -m POST -o csv -host "$function.default.example.com" http://$kuberhost/ >./data/"$function"."$num".for.csv + fi + fi + done +fi +\end{lstlisting} + +\clearpage +\section{Emelkedő terhel\'est megval\'os\'itő m\'er\'es Bash szkriptnyelven} +\begin{lstlisting}[label=code:bash-banchmark-climb] +if [[ $* == *"--climb"* ]]; then + while [[ $climb -lt $climb_max ]]; do + climb_rps=$((rps * climb)) + echo -e "Rps: $climb_rps" + if $kubeless; then + if [[ $* == *"--loadtest"* ]]; then + loadtest -k -H "Host: $function.kubeless" --rps $climb_rps -c 1 -t $time -p "$function_firendly".body http://$kuberhost/"$function" >./data/"$function"."$climb_rps".climb.txt + else + hey -c $climb -q $rps -z $time -m POST -o csv -host "$function.kubeless" -D "$function_friendly".body -T "application/json" http://$kuberhost/"$function" >./data/"$function"."$climb_rps".climb.csv + fi + else + if [[ $* == *"--loadtest"* ]]; then + loadtest -k -H "Host: $function.default.example.com" --rps $climb_rps -c 1 -t $time http://$kuberhost/ >./data/"$function"."$climb_rps".climb.txt + else + hey -c $climb -q $rps -z $time -m POST -o csv -host "$function.default.example.com" http://$kuberhost/ >./data/"$function"."$climb_rps".climb.csv + fi + fi + climb=$((climb + 1)) + done +fi +\end{lstlisting} + +\section{Jmeter kimenet\'et feldolgoz\'o k\'odr\'eszlet, Python nyelven} +\begin{lstlisting}[label=code:jmeter-analyze] +class JmeterAnalyzer(CsvAnalyzer): + def __init__(self): + super().__init__() + self.responsepersec = {} + + def processfile( + self, + fname, + shouldprint: bool = False): + with open(fname, 'r') as f: + data = csv.reader(f) + fields = next(data) + for row in data: + items = zip(fields, row) + item = {} + for (name, value) in items: + item[name] = value.strip() + sec = datetime.datetime.fromtimestamp( + int(item['timeStamp']) / 1000.0).strftime('%c') + if sec not in self.responsepersec: + self.responsepersec[sec] = [] + self.responsepersec[sec].append(float(item['Latency'])) + + def collectinfo(self, shouldprint: bool = False) -> None: + self.walkresponsepersec(self.responsepersec, shouldprint) +\end{lstlisting} + +\clearpage +\section{Hey kimenet\'et feldolgoz\'o k\'odr\'eszlet, Python nyelven} +\begin{lstlisting}[label=code:hey-analyze] +class HeyAnalyzer(CsvAnalyzer): + def __init__(self): + super().__init__() + + def processfile( + self, + fname, + shouldprint: bool = False): + with open(fname, 'r') as f: + data = csv.reader(f) + fields = next(data) + responsepersec = {} + for row in data: + items = zip(fields, row) + item = {} + for(name, value) in items: + item[name] = value.strip() + sec = int(item['offset'].split('.')[0]) + if sec not in responsepersec: + responsepersec[sec] = [] + else: + responsepersec[sec].append(float(item['response-time'])) + self.walkresponsepersec(responsepersec, shouldprint) + +\end{lstlisting} diff --git a/src/content/closing.tex b/src/content/closing.tex new file mode 100644 index 0000000..920fe0c --- /dev/null +++ b/src/content/closing.tex @@ -0,0 +1,60 @@ +% !TeX root = ../thesis.tex +\chapter{A rendszer teljesítménymérése} +Dolgozatunk e fejezetében bemutatunk egy olyan módszertant és eszközöket, amik segítségével egy komplex mikroszolgáltatásokból álló rendszerben megtalálhatók az esetleges gócpontok, valamint azok orvoslására javaslat tehető. Emellett bemutatjuk az ennek kidolgozásához és ellenőrzéséhez felhasznált eszközöket. +\section{Mérési környezet ismertetése} +A fejlesztés és teljesítménymérés idejére létrehoztunk egy Kubernetes klasztert, amiben futtattuk a rendszert. A klaszterben három Master és ugyanennyi Worker volt, mindegyik virtuális gépen futott, Microsoft Hyper-V hypervisorban. A Mastereknek kettő processzormagja és nyolc gigabájt memóriája volt, a Workereknek négy magot, valamint tizenhat gigabájt memóriát allokáltunk. A klaszter három fizikai gépen futott, mindegyikben Intel Xeon E5-2450L processzor, valamint 64 gigabájt memória volt. Egy Master és egy Worker példányt telepítettünk mindegyik fizikai gépre. +<Ábra a fizikai architektúráról> +A fizikai hosztgépek kétszer egy gigabites hálózaton kerültek összekötésre. Amint az <ÁBRAHIVATKOZÁS> -n is látható, az egyik hálózaton a hypervisorok és a virtuális gépek az internetet érték el, ezt csak frissítések és csomagok letöltésére használtuk. Emellett egy fizikailag teljesen különálló hálózat állt a virtuális gépek rendelkezésére a klaszter forgalmának lebonyolítására. +Mivel a fürtnek számos tagja volt, telepítettünk egy külön fizikai gépre egy HAProxy HTTP és TCP terheléselosztót, ami a kéréseket roundrobin algoritmussal osztotta el az egyes node-ok között. Ennek segítségével volt elérhető az egyes mikroszolgáltatások API-ja és az MQTT broker az IoT eszközök számára. Ebben a fizikai gépben egy Intel Core i5 2550K és 16 gigabájt ram volt. +A Kubernetes klaszterben a Calico hálózati implementációt használtuk, ami nem hoz létre virtuális hálózatot a meglévő fölé, hanem az egyes alkalmazások és kompnensek között különálló IP alhálózatok és útvonalválasztás segítségével biztosítja a megfelelő izolációt. Emellett NGINX Ingress Controllert használtunk. Ez egy NGINX webszerver konfigurációjával realizálja az Ingress Controller funkcionalitását. +A mikroszolgáltatásokat kiszolgáló relációs adatbázisokat egy külön virtuális gépen futó PostgreSQL szolgálta ki, aminek 2 processzormagot és két gigabájt memóriát allokáltunk. +A méréseket futtató számítógépben egy Core i7 3770 és 16 gigabájt ram volt, valamint csatlakozott mind a publikus, mint a magánhálózatra. + +\section{Mérőszoftver ismertetése} +Mint azt az előző fejezetben ismertettük a leghosszabb út, amit egy minta és az arra generált válasz megtehet egy seregélyként kategorizált minta tesz meg. Ebből következik, hogy egy kritikus mérés a beküldött HTTP kérések és az érkező MQTT üzenetek között eltelt idő lehet. Olyan kész mérőeszköz viszont, ami ennek a mérésére képes nem elérhető, ezért egy saját mérőeszköz fejlesztése mellett döntöttünk. +Annak érdekében, hogy a lehető leggyorsabban legyen képes a szoftver kéréseket generálni azokat indulás után először kigenerálja azok törzsét az Input Service elvárt sémában található eszközazonosító kitöltésével, a többi mező és rész előre beállított sablont érintetlenül hagyásával. Parancssori paraméterként megadható a használni kívánt konkurenciaszám, ami egy külön folyamatot jelent. Az egyes folyamatok a következő lépésben egy saját listában nyilvántartják az aktuális rendszeridőt, elküldenek egy HTTP kérést az előre elkészítettek közül, majd egy másik listába is feljegyzik a rendszeridő aktuális értékét. Fontos kiemelni, hogy az egyes worker folyamatok minden kérés végéig blokkolnak, azaz megvárják, amíg megérkezik a válasz. Ezt a lépést addig ismétlik, amíg a mérést felügyelő folyamat – az előre beállított idő leteltével – le nem állítja őket. Ez alatt és után 600 másodpercig, szintén külön folyamatban, a szoftver fogadja az MQTT-n érkező üzeneteket és feljegyzi azok érkezési idejét egy listába. +Miután minden folyamat végzett, a különböző HTTP kéréseket generáló folyamatoktól lekérdezi a küldési és fogadási időpontokat tartalmazó listákat és egyesíti azokat egy-egy nagy listába, amik a kérések elküldése szerint kerülnek rendezésre. Ez úgy lehetséges, hogy a szoftver minden kéréshez rendel egy egyedi azonosítót, amit a listában az időbélyeg mellé csatol. Ugyanez teszi lehetővé az MQTT üzenetek HTTP kérésekhez párosítását, ugyanis a mérni kívánt rendszer a bemeneti API-ján elfogad egy egyedi azonosítót, amit felhasznál az MQTT téma összeállítása során. Amennyiben a mérések során minden esetben egyedi azonosítóval látunk el egy-egy kérést, azok végig egyértelműen azonosíthatók maradnak lehetővé téve az egyes mérőkomponensek külön folyamatba választását. + +\section{Mérőszoftver értékelése} +Amennyiben a mérőszoftver segítségével méréseket futtatnánk a kapott eredmények csekély információt hordoznának egyéb adatok híján, ugyanis bizonytalan lenne, hogy a mérés a rendszer vagy a mérőeszköz legjobb teljesítményét mutatja, nem tudjuk melyik teljesítményét mértük ki. A mérőszoftvert Pythonban készítettük, ezért annak teljesítménye nem feltétlen haladja meg a mért rendszerét. +Ezt a problémát megoldandó elkészítettünk egy a rendszert imitáló webes alkalmazást. Az alkalmazást Kotlinban írtuk, amiben a korutinok segítségével könnyű aszinkron, nem blokkoló kód írása. Ennek köszönhetően az alkalmazás minden HTTP kérést aszinkron módon szolgál ki, ezzel emelve az alkalmazás áteresztőképességét. Amennyiben az alkalmazáshoz GET kérés érkezik, az egy nullás karakterrel tér vissza. Ezt a viselkedést a mérő alkalmazás működésének tesztelésére hoztuk létre. Ha az alkalmazáshoz POST kérés érkezik, ellenőrzi, hogy a kérés megfelel-e az Input Service által elvártaknak. Amennyiben nem, 500-as hibakóddal válaszol. Amennyiben a kérés átmegy a validáción, a kérés törzséből beolvassa az eszközt – vagy ez esetben a kérést – azonosító mező értékét és aszinkron módon küldd egy üzenetet az MQTT brókernek továbbításra a megfelelő témára, majd válaszol a kérésre egy húsz karakter hosszú karakterlánccal. Ez utóbbi célja, hogy a HTTP válasz mérete is nagyságrendileg akkora legyen, mint amekkorát az Input Service küldene. +Ennek az alkalmazásnak referenciaként teszteltük a teljesítményét az Apache Benchmark (ab) eszközzel. + +Az <ÁBRAHIVATKOZÁS> n is látható, hogy az ab (ab oszlop) és az általunk készített szoftver (BirbBench – requests oszlop) nagy a különbség teljesítmény téren. Ezt a különbséget nem tartottuk elfogadhatónak . A gyanú gyorsan az általunk használt Python HTTP kliensre, a requests-re terelődött, ugyanis az teljes egészében Pythonban készült, valamint a PyCurlhöz összehasonlító teljesítménymérésekben lemarad. Utóbbi egy vékony Python réteg a C-ben implementált libcurl felett. Valóban, a PyCurl használata esetén a mérőeszköz által mért áteresztőképesség jobban megközelítette az ab által elértet, de nem érte azt el, viszont ez nem volt célunk. Ezen mérések által van referenciánk arról, milyen karakterisztikákkal rendelkezik a mérőszoftverünk HTTP kliense. +Az MQTT komponens értékelése során is nem várt anomáliát figyeltünk meg. Amint az <ÁBRAHIVATKOZÁS>n megfigyelhető, az MQTT üzenetek késleltetési ideje a HTTP kérésekhez képest a mérés során szigorúan monoton növekedett, ami arra enged következtetni, hogy vagy a broker áteresztőképességénél nagyobb rátával küldi neki az üzeneteket a Kotlinos alkalmazás, vagy a kliens képes túl lassan fogadni az üzeneteket. Előbbire enged következtetni, hogy a broker folyamata a Workeren egy processzormagot teljesen kihasznál. +<ábra: mqtt latency megy fel, mint a 21-es busz a normáfra> +A fenti hipotézis ellenőrzésére elkészítettünk egy olyan Kotlin programot, ami letárolja az egy másodperc alatt érkezett üzeneteket, majd ezt összehasonlítottuk a Pythonban készült mérőszoftverrel. Az összehasonlítás során +Ezek alapján arra következtettünk , hogy az általunk használt Apache Artemis MQTT broker egy példányt használva a számunkra elérhető hardveren körülbelül száz egyedi témára érkező üzenetet képes továbbítani. + +\section{Skálázódási lehetőségek felmérése} +Méréseinkkel a rendszer skálázhatóságát szerettük volna megvizsgálni, viszont ehhez tudnunk kellett, mely komponenseket érdemes skálázni, melyek azok a mikroszolgáltatások, amk egy adott kérést a legtovább dolgozzák fel, ezzel a rendszerben szűk keresztmetszetként viselkednek. Mivel a mikroszolgáltatásaink egy távoli Kubernetes klaszterben futnak a tradicionális, fejlesztői eszközökbe épített profilozó használata nem lehetséges. Ezt a problémát hivatottak megoldani az Alkalmazás Teljesítmény Monitorozó eszközök. Számos ilyen eszköz elérhető, mint például a Jaeger, vagy a mikroszolgáltatásokban keletkezett hibákat is gyűjteni képes Sentry. Ezek között a különbség tipikusan a támogatott nyelvek és a szerverben használt technológiákban rejlik, mindegyik képes egy megjelölt kódblokk futási idejét monitorozni. A projekt fejlesztése során Sentryt használtunk az elosztott hibakeresési képességei, valamint elsőrangú Python támogatása miatt. +Ezen vizsgálatok során a módszertanunk az volt, hogy a rendszerbe beküldtünk egyetlen mintát, valamint korábban ismertetett mérőeszközzel generáltunk nagyobb terhelést a rendszerben, majd a Sentry által aggregált adatokat összevetettük és értkeltük. Minden mérést húsz alkalommal ismételtünk és az eredmények mértani közepét vettük annak érdekében, hogy egy-egy kiemelkedő mérés ne befolyásolja aránytalanul a kapott eredményeket. + +Általánosan elmondható volt a tesztek alapján, hogy a hangmintákkal dolgozó, valamint mesterséges intelligenciát alkalmazó mikroszolgáltatások válaszideje nagyságrendekkel nagyobb, mint a csak szöveges adatokkal dolgozóké. Ennek oka valószínű az Input és a Storage mikroszolgáltatások esetében a HTTP kérések mérete lehet, a Classification Service-nél pedig a mesterséges intelligencia futási idejéből adódhat a magas átfutási idő. Ezt ellenőrizendő finomítottuk a használt tranzakciókat, hogy a kérdéses HTTP kérések során elvégzett műveletek ideje pontosan látszódjon. + +Ez alapján (ahogy az <ÁBRAHIVATKOZÁS> is látható) megállapítható, hogy valóban a kérés fogadása, valamint a kezelése tart sokáig az Input Service-ben, az egyéb műveletek rövid idő alatt lezajlanak. Ennek okán az egyik skálázásra kijelölt komponenspár az Input és Storage Service-ek voltak. + +Úgy döntöttünk ezeket közösen érdemes skálázni, hiszen az <ÁBRAHIVATKOZÁS>t összevetve az <ÁBRAHIVBATKOZÁS>val is megfigyelhető, hogy a Storage Service esetében a HTTP kérés fogadásával és a hangfájl multipart kérésből kivételével eltöltött idő igen közel van az Input Service-nél tapasztaltakhoz. Ez egy várható eredmény volt, ugyanis mindegyik mikroszolgáltatás Python nyelven, a Flask webes keretrendszert használva készült, így ezen műveletek implementációja és belső viselkedése nagyon hasonló. + +A Classification Service-t górcső alá véve a korábbi hipotézisünk beigazolódni látszik, ugyanis a minta feldolgozásával eltöltött idő közel 85\%-át tölti a mesterséges intelligencia futtatásával a mikroszolgáltatás. Ez azt jelenti, hogy nagy számú egyidejű beérkező minta esetén mindenképpen skálázni kell ezt a mikroszolgáltatást is. +A többi mikroszolgáltatás esetében nem tartottuk indokoltnak a skálázás alkalmazását, ugyanis azok nagy számú konkurens kliens esetében is alacsony válaszidővel képesek voltak feldolgozni az egyes kéréseket, így azok a rendszer áteresztőképességét nem korlátozzák. + +\section{Input és Storage Service-ek skálázásának vizsgálata} +Száz konkurens kliens esetén az Input Service késleltetése nem növekszik meg lényegesen az egy, vagy húsz konkurens kliensek esetén mérttől, amint azt <ÁBRAHIVATKOZÁS>n is láthatjuk. Ez jó jel a skálázhatóságára tekintve, ugyanis ebből arra következtethetünk, hogy ez a mikroszolgáltatás kiszámíthatóan reagál a változatos terhelésekre. Ez alapján megsejthetjük, hogy amennyiben kettő példányt indítunk a komponensből annak áteresztőképessége közel kétszeresére növekedik. Ehhez viszont ki kell kössük, hogy a Storage Service skálázása is szükséges, ellenben az továbbra is szűk keresztmetszet marad. + +A sejtés beigazolódni látszik, ugyanis míg ez a két mikroszolgáltatás egy-egy példányt használtva tíz kérést volt képes feldolgozni másodpercenként, kettő példányt használva húszat, öt esetében pedig negyvennyolcat. + + +\section{Classification Service skálázásának vizsgálata} +A Classification Service bemeneti interfésze, mivel üzenetsoron kapja a bemeneti adatokat más jellegű, mint az Input vagy a Storage Service-eké. A teljesen aszinkron bemeneti interfészén csak akkor kap adatot, ha épp nem dolgoz fel egy másikat, valamint az aszinkron kimeneti interfésze miatt nem blokkolja másik mikroszolgáltatás sem. Emiatt az üzenetsor egyfajta terheléselosztóként is felfogható. + +A fent leírtak alapján azt várjuk, hogy a mikroszolgáltatás skálázása esetén a komponens áteresztőképessége a replikák számával arányosan fog nőni. Amint ez <ÁBRAHIVATKOZÁS>n látható, ez így van, amíg egy példány két mintát képes másodpercenként feldolgozni, tíz példány húszat, húsz példány pedig negyvenet. + +\section{Eredmények értékelése} +A fejezetben ismertetett mérések eredményeiből számos konzekvencia levonható a rendszerrel kapcsolatban. Az első, hogy a teljesítmény szempontjából szűk keresztmetszetet képző komponensek jól skálázódnak. A szűk keresztmetszet megszüntetésére vagy enyhítésére viszont egyéb alternatívák is láthatók. Az Input és Storage Service-ek vizsgálata esetén érdemes lehet meggondolni azok összevonását, ugyanis ezzel a lépéssel az Input Service válaszideje a felére csökkenthető. Ezen túl a komponens skálázásával jól növelhető az áteresztőképessége. +A Classification Service esetében javasoljuk a Kubenetesben automatikus skálázás alkalmazását, egyedi metrikákat megfogalmazva az üzenetsoron egységnyi idő alatt beérkező üzenetek alapján. Ez megoldja a szűk keresztmetszet problémáját amellett, hogy nem pazarol feleslegesen erőforrást a klaszterben. Ennek a skálázódásnak implementációjánál viszont figyelni kell arra, hogy az új példányok az első minta feldolgozása során le kell kérjék az aktuális modellt a Model Service-től. + +\section{A módszer általános leírása} +Az általunk itt alkalmazott módszer jól felhasználható más hasonló mikroszolgáltatásokra épülő szoftverek esetében. Első lépésként valamilyen Alkalmazás Teljesítmény Monitorozó megoldás használata és integrálása kulcsfontosságú. Ezek segítségével megállapítható, mely mikroszolgáltatások szükségesek vizsgálatra skálázási szempontból, melyek jelenthetik a szűk keresztmetszetet. Természetesen a skálázás előfeltétele, hogy a mikroszolgáltatásaink állapotmentesek legyenek. A szűk keresztmetszetet gyanúsan alkotó mikroszolgáltatások azok lehetnek, melyek legalább egy nagyságrenddel nagyobb idő alatt dolgoznak fel egységnyi kérést a rendszerben, ezek lehetnek érdemesek további vizsgálatra. +Második lépésként meg kell vizsgáljuk a kérdéses komponensek miként viselkednek skálázás esetében. Ezt terheléstesztek segítségével érhetjük el. Amennyiben egy komponens nem skálázódik jól, annak refaktorálására lehet szükség. +Az itt leírt tesztek segítségével elég adatot gyűjthetünk ahhoz, hogy javaslatokat tegyünk a rendszerben esetlegesen szükséges változásokra. diff --git a/src/content/create-functions.tex b/src/content/create-functions.tex new file mode 100644 index 0000000..712aa42 --- /dev/null +++ b/src/content/create-functions.tex @@ -0,0 +1,60 @@ +\chapter{F\"uggv\'enyek l\'etrehoz\'asa} +A rendszerek sajátosságai miatt ugyanazt a kódot nem lehet változtatás nélkül felhasználni a két eltérő rendszerben. Mindkét rendszerre két tesztfüggvényt valósítottam meg. Az egyik célja a lehető legrövidebb válaszidő és a legnagyobb áteresztőképesség. A másik célja a kérésenként nagyobb processzorterhelés generálása. + +Az első egy Go nyelven megvalósított tesztfüggvény, amely a meghívás után “Hello Go!” szöveggel tér vissza. A Kubeless rendszerhez írt függvény szignatúrája egyezik \aref{code:hello-kubeless-go} k\'odr\'eszletben l\'athat\'o függvényével. Függőségként importálni kell a Kubeless sztenderd könyvtárát. + +Knative rendszerben szükség van a Go sztenderd könyvtárban megtalálható HTTP szerver implementációra, valamint egy belépési függvényre, amely elindítja a webszervert és beköti a függvényünket úgy, hogy az alapértelmezett URL - ahol elindul a webszerver - az ide érkező kéréseket továbbítsa neki. Mivel a Knative-ba Docker Image-eket lehet telepíteni, ezért azt is létre kell hozni. Annak érdekében, hogy a végső Image a lehető legkisebb méretű legyen, a Go program binárissá fordítását külön végezzük el, a végső Image-be csak bemásoljuk azt. Erre a Docker ad eszközt, az úgynevezett multi-stage buildek segítségével. Ez azt jelenti, hogy egy külön végrehajtási láncot leírva lefordítjuk a kódot, majd a végső Image-be csak bemásoljuk a fordítással végzett konténer Image-éből. Az elkészült Image-et - melyet le\'ir\'o Dockerfile \aref{code:dockerfile-hello-go} k\'odr\'eszleten l\'athat\'o - a Docker Hubra feltöltöttem, hogy ne kelljen minden frissen telepített Workernek megépítenie az Image-et. + +\begin{lstlisting}[float=!ht,caption={Echo t\'ipus\'u f\"uggv\'eny Docker Image-\'et le\'ir\'o Dockerfile},label=code:dockerfile-hello-go] +FROM golang:1.13 as builder + +WORKDIR /app + +COPY go.* ./ +RUN go mod download + +COPY . ./ + +RUN CGO_ENABLED=0 GOOS=linux go build -v -o server + +FROM alpine:3 + +RUN apk add --no-cache ca-certificates + +COPY --from=builder /app/server /server + +CMD ["/server"] +\end{lstlisting} + +A várhatóan nagyobb processzorterhelést generáló függvényként egy Python nyelven implementált prímszám számoló szerepelt. E függvény viselkedése egyezik mindkét rendszerbe telepített verzió esetében, csupán a bemeneti érték kinyerése tér el. A függvény erről a bemeneti értékről dönti el, hogy az prímszám-e. Kubeless esetében a Go-val ellentétben nincs szükség semmilyen függőség megjelölésére, a megírt függvényt egyből lehet telepíteni. + +A Knative esetében szintén eltérő módon érdemes Docker Image-et készíteni a megírt függvényből. Szükség van a Flask nevű könyvtárra, amely segítségével webes alkalmazásokat lehet készíteni Pythonban. Használata igen hasonló a Go-ban megtalálható implementációhoz. Úgynevezett dekorátor segítségével lehet a Flask számára jelezni, hogy az adott függvény milyen URL meghívásakor fusson le, valamint a használni kívánt port számát is itt lehet megadni. A Docker Image építése során multi-stage build használatára nincsen szükség, hiszen a Python értelmezőnek mindenképpen jelen kell lennie a végső Image-ben is. A Flask telepítése mellett úgy döntöttem, hogy a \textit{gunicorn} Pythonban implementált webszervert is telepítem, valamint azt használom, mint webszervert a Docker Image-ben. Használatának előnye, hogy képes kihasználni a Python által nyújtott multiprocessing lehetőségeket, amely azt jelenti, hogy több Python értelmezőt indítva, több folyamat használatával jobb teljesítményt lehet elérni, mint több szál használatával, ugyanis a Python értelmező egyszerre egy szálon futó programkódot értelmez. + +Minden Knative függvényhez definiáltam egy-egy YAML állományban egy olyan Service-t, amelyhez tartozó podok számát nullára képes leskálázni a rendszer, valamint egy konkurencia alapú skálázást használó Service-t. Az ut\'obbit le\'ir\'o YAML \'allom\'any \aref{code:yaml-isprime-py} k\'odr\'eszleten l\'athat\'o. + +\begin{lstlisting}[float=!ht,caption={Pr\'imsz\'aml\'al\'o f\"uggv\'eny Knative Service obejktum\'at le\'ir\'o YAML},label=code:yaml-isprime-py] +apiVersion: serving.knative.dev/v1alpha1 +kind: Service +metadata: + name: isprime-py-sc-cc + namespace: default +spec: + template: + metadata: + annotations: + autoscaling.knative.dev/class: kpa.autoscaling.knative.dev + autoscaling.knative.dev/metric: concurrency + autoscaling.knative.dev/target: "10" + autoscaling.knative.dev/minScale: "1" + autoscaling.knative.dev/maxScale: "100" + spec: + containers: + - image: tormachris/isprime-python + env: + - name: TARGET + value: "Py" +\end{lstlisting} + +Az elkészített függvényen, valamint a Docker Image-eket leíró Dockerfile-okat Git verziókezelőrendszerrel kezeltem, a létrehozott repository-t a GitHub szolgáltatásba feltöltöttem. Ez lehetővé tette a Travis Continuos Integration/Continuos Delivery rendszer használatát. Ezt arra használtam, hogy a változások nyugtázása után, valamint azok GitHubra történő feltöltése után a Docker Image-ek automatikusan épüljenek meg, valamint kerüljenek fel a Docker Hubra. Fontos, hogy ez nem feltétlen jelenti, hogy a Kubernetes-ben éppen futó vagy később létrejövő podok a legfrissebb Image-et fogják használni. Ehhez szükség van vagy a latest nevű címkét használni vagy az ImagePullPolicy nevű opciót bekapcsolni a Knative Service vagy Kubernetes Deployment definiálásánál. + +Az elkészített függvények Kubeless-be telepítése a korábban telepített parancssori interfész segítségével lehetséges. A függvény telepítése, ahhoz HTTP végpont csatolása, valamint a skálázás létrehozása különálló parancs. Skálázás esetében a processzor limit alkalmazása a függvény telepítését végző parancs argumentumaként adható meg. Ebből adódóan skálázás esetén nem lehet csak a skálázás telepítését végrehajtó parancsot kiadni. A Kubeless függvények telepítését megkönnyítendő, elkészítettem egy Bash nyelven írt szkriptet, amely paramétereként elvárja a függvény és az állomány nevét, ami tartalmazza azt, illetve a futtató környezet nevét és azt, hogy kell-e skálázás. Ezek alapján kiadja a szükséges parancsokat helyesen paraméterezve. Ezáltal a parancssori interfész helyes használatát gyorsabbá és könnyebbé tettem. diff --git a/src/content/introduction.tex b/src/content/introduction.tex new file mode 100644 index 0000000..e569cb0 --- /dev/null +++ b/src/content/introduction.tex @@ -0,0 +1,10 @@ +% !TeX root = ../thesis.tex +%---------------------------------------------------------------------------- +\chapter{\bevezetes} +%---------------------------------------------------------------------------- + +A felhő alapú technológiák elterjedésével egyre növekszik az ilyen megoldások iránti igény. Az ebbenrejlő lehetőségek kihasználására képes alkalmazások fejlesztése egyedi és új kihívásokat jelent. Az ilyen alkalmazások komponensei általában egymástól elválasztottak, lazán kötődnek és állapotmentesek. Ez tipikusan, de nem szükségszerűen mikroszolgáltatás alapú alkalmazás architektúrát, agilis fejlesztési folyamatokat, konténer alapú technológiák használatát jelenti. +Szőlőtulajdonosoknak éves szinten jelentős kárt okoznak a seregélyek, akik előszeretettel választják táplálékul a megtermelt szőlőt. Az ilyen kártevő madarakat elriasztó eszközök általában folyamatos ultrahang kibocsájtásával érik el a kívánt hatást. Ezekhez képes egy intelligens, célzottan működő rendszer a környezetre kisebb ráhatással is elérhet hasonló eredményeket, hiszen nincs szükség a többi állatot is zavaró ultrahang kibocsájtására, ha a kártevők nincsenek jelen. Emellett az Internet of Things és a felhő adta lehetőségeket kihasználva a szőlőültetvények számára az általunk készített rendszer további hozzáadott értéket is hordoz. +Az Internet of Things eszközökről általánosságban elmondható, hogy olyan mindennapi használati tárgyak vagy ipari eszközök, amelyeket hálózati kapcsolattal és számítási kapacitással is felruháztak. Az említett hálózati kapcsolat lehet többek között egyes eszközök közötti, vagy akár egy felhőben lévő rendszerhez is kapcsolódhatnak a készülékek. Nagy számú eszközpark esetén megoldandó probléma a készülékek állapotának megfigyelése és központi irányítása is. +Azért, hogy a riasztás effektív legyen elengedhetetlen a relatív alacsony körbefordulási idő a rendszer és az egyes eszközök között. Ahhoz, hogy megtudjuk egy adott rendszerben ez az érték miként alakul méréseket kell végezzünk. Mikroszolgáltatás alapú rendszerek esetében az is érdekes információ lehet, hogy az egyes mikroszolgáltatások mennyi idő alatt képesek egy adatpontot feldolgozni, hogy reagálnak nagy terhelésre és mennyire skálázhatóak, valamint ezeknek milyen hatása van az egész rendszerre. +Feladatunk egy seregélyeket hang alapján felismerni és elriasztani képes rendszer megtervezése és fejlesztése volt, amely kizárólag nyílt komponenseket használ fel. Kiemelten fontos volt, hogy az általunk elkészített rendszerbe későbbi fejlesztések során könnyedén illeszthetők legyenek más típusú adatok és kimenetek. A rendszer architektúráját ezen szempontok és a korábban ismertetett követelményeket figyelembe véve készítettük el. A rendszer elkészülte után megterveztünk és elvégeztünk méréseket, amiknek a célja a rendszer nagy számú szenzor melletti viselkedésének vizsgálata és az egyes komponensek skálázásának az adatok körülfordulási idejére gyakorolt hatásának elemzése volt. Ezek alapján ajánlásokat fogalmazunk meg a saját rendszerünkre, valamint hasonló rendszerek fejlesztésére vonatkozóan. diff --git a/src/content/preparation.tex b/src/content/preparation.tex new file mode 100644 index 0000000..0a47624 --- /dev/null +++ b/src/content/preparation.tex @@ -0,0 +1,22 @@ +\chapter{A rendszer ismertetése} + +A rendszer tervezését olyan alapvető felelősségekkel kezdtük, mint adatok fogadása, ezek tárolása, valamint továbbítása. A fejlesztési folyamat során ezektől haladtunk az egyre specifikusabbak fele, mint a mesterséges intelligencia által használt modellek tárolása és dinamikus frissítése. Ennek a folyamatnak eredményeképp készítettük el a <ÁBRAHIVATKOZÁS> látható architektúrát. A rendszer minden komponense egy-egy mikroszolgáltatás. Ezt a tervezési folyamat egy korai lépésében döntöttük el. E döntés mögött két indokunk volt. Az első a fejlesztés során a kooperáció könnyebbsége, hiszen a mikroszolgáltatások interfészeinek egyeztetése után azok egymástól függetlenül fejleszthetők, ezzel a kooperációt is elősegítve. Emellett ettől a döntéstől azt vártuk, hogy amennyiben a rendszer tervezése során követjük a korábban leírt ajánlásokat, a komponensek skálázhatósága jobb lesz, így a nagyobb terhelés esetén nem lesz érzékelhető növekedés a válaszidőben. Ebben a fejezetben szeretnénk bemutatni az általunk tervezett architektúrát a beérkező adatok útját bejárva. +\section{Felhő rendszer ismertetése} + +A rendszerbe két típusú adat érkezhet . A kihelyezett eszközök által felvett hangadatok a felhő rendszerbe az Input Service-hez kerülnek be, ahol a beérkezett hangfájl és az azt kísérő üzenet formátumának validálása után az alapvető metaadatok – többek között a küldő eszköz azonosítója, beérkezés dátuma, valamint az egész felhős rendszerben használt egyedi azonosító – eltárolódnak. Ezt követően az állomány továbbításra kerül a Storage Service-nek, ahol egy objektumtárban kerül eltárolásra. Ez azért előnyös, mert ha egy mintát szeretnénk többször is feldolgozni , a feldolgozott mintákat meghallgatni validálás céljából vagy az AI Service-ben használt modellt a rendszer felhasználója pontosítani szeretné a rendelkezésre álló valós mintákkal, akkor lehetőség van azt lekérni egyéb metaadatai mellett az egyedi azonosító segítségével. Erre viszont csak limitált ideig van lehetőség, ugyanis az eltárolt hangfájlok beállítható idő múlva – alapértelmezés szerint egy hét – törlésre kerülnek, hogy a beérkezett minták által elfoglalt lemezterületet kordában tartsuk. A fájl sikeres tárolását követően az Input Service egy üzenetsorra beküldi a minta azonosítóját, ezzel jelezve a feldolgozó komponensnek az új minta beérkezését és azt, hogy milyen azonosítót használhat a Storage Service-től lekérdezéskor. +Az üzenetsoron az AI Service példányai fogadják az üzenetet, ezen komponens felelőssége a minták klasszifikálása többek között seregély, traktor és egyéb zaj kategóriákba. Még mielőtt megkezdhetné a feldolgozást, a Model Service-nél ellenőrzi, hogy elérhető-e újabb modell, amivel dolgozni tud. A Model Service egy képes több típusú – beleértve a felhő rendszerben és az IoT eszközön található mesterséges intelligenciák által használtakat – modelleket képes tárolni, a modellek verzióját követni, valamint visszaadni REST API-n keresztül. Az éppen használt modell friss állapotának eldöntésére lekéri az alapértelmezett modell metaadatait, amiket összevet a lokálisan meglévő modell metaadataival. Amennyiben valóban elérhető újabb modell, letölti azt és onnan betölti további használatra. E mechanizmus által lehetőség van a rendszer által használt modellek dinamikus frissítésére és cseréjére , valamint a Model Service-ben az alapértelmezett modell korábbira visszaállításával akár korábbira visszatérés is könnyedén lehetséges. A modell ellenőrzése után az AI Service-ben található mesterséges intelligencia elvégzi a hangfájl klasszifikációját. Ennek eredményét a minta azonosítójával egyetemben egy másik üzenetsoron publikálja. +Az üzenetsorra érkező adatokat három mikroszolgáltatás fogadja, de az üzenetsornak hála újabb ilyen komponens illesztése a meglévő a rendszerhez könnyedén lehetséges. A Results Service feladata eltárolni minden egyes minta adatait úgy, hogy azok egyesével lekérdezhetők legyenek. Ennek a mikroszolgáltatásnak a segítségével lehetséges harmadik fél által gyártott szoftverekhez csatolni az általunk fejlesztett rendszert. A Metrics Service felelőssége idősoros adatbázisba illeszteni az eredményeket. Az idősor adatbázisból statisztikai lekérdezések segítségével betekintést nyerhetünk a szőlőben a seregélyek mozgásába, tendenciáiba akár egy harmadik fél által fejlesztett dashboarddal. Az utolsó mikroszolgáltatás, ami megkapja a klasszifikációk eredményeit a Guard Service. Ez a mikroszolgáltatás üzenetsoron küld egy riasztási parancsot annak az eszköznek, ahonnan seregélyként detektált minta érkezett. +Az egyes komponensek közötti kommunikáció alapvetően HTTP feletti REST API-k segítségével történik, kivéve az előzőekben említett helyeken. Előbbit olyan esetekben alkalmaztuk, amikor az adott interfész külső alkalmazások felé elérhető, nagy mennyiségű adat átvitele történik, vagy fontos a szinkron kommunikáció. Jó példa a Storage Service interfésze, ugyanis itt fontos tudni, hogy mikor áll készen a mikroszolgáltatás a minta kiszolgálására, valamint egy tipikus JSON formátumú üzenethez képest nagy mennyiségű, bináris adat átvitelét jelenti. Természetesen üzenetsorra is megvalósítható lenne ez a viselkedés, viszont jelentősen bonyolultabb üzleti logikát igényelt volna a megvalósítás, jelentősebb előnyt viszont nem hozna. +Az egyes mikroszolgáltatások közötti üzenetsorok AMQP (Advanced Message Queuing Protocol) felett zajlanak. Emellett akkor döntöttünk, amikor több komponensnek is szüksége van egy művelet eredményére – mint például az AI Service kimenetére reagáló három mikroszolgáltatás –, vagy nem szükséges az adott üzenetre válasznak érkeznie. Ilyen az Input Service által az AI Service-nek küldött értesítés is. +Az interfészek és üzenetek tervezése során kiemelten figyeltünk arra, hogy minden üzenetsoron és REST API-n átvitt adat lehetőleg minél kisebb legyen, csak a szükséges adatok kerüljenek továbbításra. Ezzel is növelve a kommunikáció hatékonyságát és kihasználva a HTTP és üzenetsor előnyeit minimális többletköltség mellett. +A minták fogadásában nem vesz részt a Command and Control Service, felelőssége az egyes eszközök és azok szenzorainak állapotának vezérlése, nyomon követése. A kihelyezett IoT eszközök az állapotukat üzenetsoron jelzik. Egy ilyen üzenet például lehet jelzés, hogy az eszköz valamilyen hibás állapotba került és javítást vagy cserét igényel, esetleg egy szenzorrol nem képes adatot olvasni, kikapcsolni készül vagy épp most kapcsolt be. Egy másik üzenetsoron hallgatják a parancsokat és végrehajtják azokat. Ilyen parancs lehet a mesterséges intelligencia által használt modell frissítése és a szenzor vagy eszköz kikapcsolása. Az irányító üzenetek küldését REST API segítségével lehet kiváltani. A Command and Control Service indulásakor nem ismeri a rendszerben futó eszközöket, azokat az első üzenetük fogadásakor jegyzi fel egy saját relációs adatbázisba, ahol követi az állapotukat. Azokat az eszközöket, amik öt perce nem küldtek státusz üzenetet, a mikroszolgáltatás hibás állapotba lépteti a belső állapotreprezentációjában. Az egy hétnél tovább el nem érhető eszközöket automatikusan kikerülnek az adatbázisból kivéve, ha a felhasználó API hívás segítségével permanensnek nem jelölte azt. +Az eszközök és a felhőben lévő komponensek közti üzenetsoros kommunikáció MQTT (Message Queue Telemetry Transport) protokollon történik, ami mellett annak flexibilis téma (topic) architektúrája mellett döntöttünk. Lehetőség van az egyes üzenetsorok vagy másnéven témák struktúrálására és ezáltal egyszere több témára üzenet küldésére, valamint feliratkozásra. Ezt a Command and Control Service esetében ki is használtuk, ugyanis az egyszere iratkozik fel minden eszköz státuszüzeneteire, valamint a struktúrált témáknak köszönhetően minden vezérlőüzenetet csak a céleszköz kap meg, ami csökkenti a szükséges hálózati forgalmat és az eszközök által feldolgozandó üzenetek számát. +\section{Internet of Things eszköz ismertetése} +Az IoT eszköz architektúrájának tervezése során a legfontosabb szempont az új szenzorok bevezetése volt. Emiatt úgy döntöttünk, hogy az egyes szenzorokat teljesen külön kezeljük. Három alapvető lépést határoztunk meg egy mért adat útja során. Az első a szenzor általi mérés elvégzése, amit az opcionális előfeldolgozás követ. Végezetül, a szoftvernek döntést kell hoznia, hogy az eredményt tovább küldje-e felhőbe, majd a döntést végre is kell hajtsa. +Azért, hogy ez a folyamat minél flexibilisebb legyen, az egyes lépéseket összefogja és indítja egy külön osztály, valamint a mintavételezéseket egy központi, belső óra vezérli. +Itt konkrét, hardveres implementációval nem foglalkoztunk, azt a szoftver tervezése és fejlesztése során elabsztracháltnak tekintettük. + +A felvázolt koncepciót a fenti osztálydiagramon valósítottuk meg. Új szenzor felvétele esetén az ISensor, IPreProcessor, ISender interfészek implementálásával és SignalProcessor osztályból leszármazással, valamint ezek az Application osztályba regisztrálásával lehetséges. Új riasztásra képes forgatókönyv esetében az IActuator interfész implementálásával van lehetőségünk a riasztás elvégzésére. +Az Application osztály tartalmazza az eszközök eseményhurkát, ami lehetővé teszi a szenzorok ismételt mintavételét, előfeldolgozását és a minta felhőbe küldését. Az általunk megvalósított viselkedés során egy ütemben a SoundSignalProcessor vezényli a hangminták kezelését. Az ütem elején egy másodperc hosszú hangmintát vesz az előre bekonfigurált mikrofonról, amit egy mesterséges intelligencia bekategorizál többek között traktor, emberhang, méhek és madárcsicsergés kategóriákba. A madárcsiripelés kategóriába sorolt mintákat továbbítja a felhőbe a SoundSender, ahol az előbbiekben leírt folyamat kerül végrehajtásra. Ez a forgatókönyv <ÁBRAHIVATKOZÁS> látható. Minden harmadik ütem végén küld az eszköz státusz frissítést a felhőnek. + +Az eszköz indulásakor az Application osztály a beállított üzenetsoron elküldi, hogy éppen bekapcsolt, hamarosan elkezd adatokat küldeni és képes parancsok végrehajtására. Utóbbi külön szálon történik, emiatt szükség volt a szenzorok offline és online állapotainak szálbiztos kezelésére a SignalProcessor leszármazottjaiban és az ezeket nyilvántartó listának is hasonlóan szálbiztosnak kell lennie. Az offline szenzorok forgatókönyve kikerül az ütemezett forgatókönyvek közül, viszont futó forgatókönyvet az alkalmazás nem szakít meg. diff --git a/src/content/results.tex b/src/content/results.tex new file mode 100644 index 0000000..e265466 --- /dev/null +++ b/src/content/results.tex @@ -0,0 +1,8 @@ +\chapter{Zárszó} + +\section{További kutatási irányok} + +Az elkövetkező időszakban szándékunkban áll megtervezni és implementálni az előző fejezetben javasolt módosításokat, valamint azok hatékonyságának értékelését is szeretnénk elvégezni. +Úgy gondoljuk a rendszerben számos lehetőség rejlik, amit érdemes lenne kiaknázni, ezért további funkciókkal szeretnénk bővíteni mind az IoT eszközön futó szoftvert, mind a felhő-natív rendszert. Egy ilyen lehet hőmérséklet és egy egyéb adatok felhasználása a seregélyek detekciója és a riasztások tüzelése elején. + +\section{Köszönetnyilvánítás} diff --git a/src/content/theory.tex b/src/content/theory.tex new file mode 100644 index 0000000..e312f4c --- /dev/null +++ b/src/content/theory.tex @@ -0,0 +1,24 @@ +% !TeX root = ../thesis.tex +\chapter{Cloud-native rendszerekről} +\label{sec:theory} + +\section{Felhő} +A felhőalapú számítástechnikában a felhasználó elől elrejtve, a szolgáltató erőforrás halmazán elosztva megvalósított szolgáltatásokat értjük, amit jellemzően virtualizációs technológiára építenek. Három alapvető szolgáltatási modellt különböztetünk meg: SaaS (Software as a Service, Szoftver, mint Szolgáltatás, például: Office 365), PaaS (Platform as a Service, Platform, mint Szolgáltatás, például: Oracle Cloud Platform) és IaaS (Infrastructure as a Service, Infrastruktúra, mint Szolgáltatás, például: Microsoft Azure). További szolgáltatási modellek: Container aaS, Function aaS, etc. +\section{Kubernetes} +A Kubernetes egy Go nyelven írt, nyílt forráskódú konténer orkesztrációs platform, amely képes konténerek automatikus konfigurációjára, skálázására, valamint bizonyos hibák automatikus elhárítására is. Több konténer technológiát támogat, köztük a Dockert is. Nagyon népszerű, gyors fejlesztés alatt álló projekt. Emiatt felhasználói és programozói interfésze gyakran változik, megkövetelve a ráépülő megoldásoktól a hasonló sebességű fejlesztést. Jól definiált interfésze miatt sok ráépülő, azt kiegészítő projekt létezik. A Kubernetes kiváló keretet nyújt mikroszolgáltatás alapú alkalmazások fejlesztésére. +<ábra példa k8s klaszterről> +Egy Kubernetes klaszterben két típusú hosztgép lehet. Mindkettőből lehet több darab, de legalább egy-egy példány kötelező. Egy Kubernetes klaszter legalább egy Masterből és Workerből épül fel, ezek több komponensből állnak. A Kubernetes Master felelős a klaszterben lezajló folyamatok irányításáért, valamint a Slave-ek - vagy más néven Workerek - és az alkalmazások állapotának nyilvántartásáért. Egy Master node számos komponensből áll, ezek a Master egy-egy feladatáért felelnek. Több Master node futtatása esetén - úgynevezett multimaster mode - csak az API Server és az etcd komponensekből jön létre több példány, a többiből egyszerre csak egy példány lehet aktív. +A Kubernetesben különböző objektumtípusokat definiáltak, ezek közül a legfontosabbakat bemutatjuk a következőkben (Pod, Deployment, Service és Ingress). +A Pod egy vagy több konténert összefogó logikai hoszt. Egy podon belül lévő konténerek osztoznak a hálózaton és a háttértáron, valamint azonos a futtatási specifikációjuk. Ez azt jelenti, hogy az egy podon belüli konténerek localhoston keresztül elérik egymást, valamint van lehetőség, hogy a konténerekben futó alkalmazások lássák a másik konténerben futó folyamatokat. Egy Kubernetes rendszerben a Pod a legkisebb egység, amit futásra lehet ütemezni. +A Deployment segítségével deklaratívan leírható egy alkalmazást felépítő podok és azok kívánt állapota. Lehetőség van megadni, hány replikát hozzon létre a rendszer. Hasonló módon lehet a podok állapotát frissíteni vagy egy korábbi állapotra visszatérni. Egy Deploymentben lehetőség van több pod definiálására, ami az alkalmazás komponensek lazább csatolását teszi lehetővé. +A podok bármikor törlődhetnek, valamint új példány jöhet belőlük létre. Minden pod saját IP címmel rendelkezik, viszont szükség van valamilyen módszerre, aminek segítségével nyomon lehet követni, hogy egy pod által nyújtott szolgáltatás milyen címen érhető el. Erre a problémára nyújt megoldást a Service, ami absztrakciót jelent a podok felett. +Néhány fontosabb szolgáltatás, melyet a Kubernetes nyújt: +Horizontális skálázás, +Konfiguráció és szenzitív adatok menedzsmentje, +Háttértár orkesztráció, +Szolgáltatások név alapján történő felderítése. +Ingress erőforrás segítségével klaszteren belüli Service erőforrást lehet azon kívülre kiszolgálni. Ennek módját az Ingress erőforrás határozza meg, amelyet az Ingress Controller nevű klaszter szintű objektum szolgál ki. +\section{Mikroszolgáltatások} +A mikroszolgáltatás vagy mikroszolgáltatás szoftverarchitektúra egy alkalmazás architektúra, amelynek segítségével a komplex, skálázható alkalmazások fejlesztése egyszerűbb, valamint a kódbázis növekedésével átlátható marad. Ezt úgy éri el, hogy az alkalmazást kisebb, önálló komponensekre bontja, ezeket lazán, tipikusan REST API-val, vagy üzenet sorok (message queue) segítségével illeszti egymáshoz. Az architektúra alkalmazása esetén felmerülnek bizonyos problémák, mint például az egyes szolgáltatásoknak meg kell egymást találniuk, vagy több példány futtatása esetén megoldandó a terheléselosztás is. Az így fejlesztett alkalmazások kiválóan illeszkednek a felhő alapú rendszerekhez, például a Kuberneteshez. Mikroszolgáltatás architektúra esetében figyelni kell az úgynevezett rejtett monolitra, amikor a fejlesztett alkalmazás viselkedéséből adódóan igazából nem mikroszolgáltatás alapú. Például, ha minden mikroszolgáltatás függ egytől, akkor az adott architektúra rejtett monolit jellegű. Pozitív tulajdonsága a mikroszolgáltatásoknak, hogy jól definiált API-k mellett az egyes szolgáltatások a saját adatszerkezetüket a nekik legmegfelelőbb módon képesek kezelni, nincs szükség kompromisszumokra az egész alkalmazást figyelembe véve. +\section{Internet of Things} +Az Internet of Things (IoT), vagy magyarul a Dolgok Internete mindennapi eszközök szenzorokkal és internet kapcsolattal ellátását jelenti. Ezek az eszközök képesek automatikusan adatok gyűjtésére és azok továbbítására. Gyakran előfordul, hogy több típusú szenzorból gyűjtött adatok egy felhős rendszerben kerülnek összegzésre és feldolgozásra, ugyanis at IoT eszközök tipikusan alacsony számítási kapacitással és fogyasztással rendelkeznek, ami az egyes eszközök árát is alacsonyan tartja. Jó példa az IoT-ben rejlő lehetőségekre egy olyan okos termosz, amely az online elérhető időjárás előrejelzések és a felhőben tárolt felhasználói profil alapján előre melegíti vagy hűti az általa irányított lakást. \ No newline at end of file diff --git a/src/figures/bme_logo.pdf b/src/figures/bme_logo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ca1c084c203828f813691efa69945d485936902b GIT binary patch literal 20185 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 HPB`m7fi@*d literal 0 HcmV?d00001 diff --git a/src/figures/classification-service-rps.png b/src/figures/classification-service-rps.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4cad40309324cb632addbdea139dfcf351035e GIT binary patch literal 57371 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 S##_b1Xjz&fO{$DsBmN7Nip(bf literal 0 HcmV?d00001 diff --git a/src/figures/classification-service-runtime.png b/src/figures/classification-service-runtime.png new file mode 100644 index 0000000000000000000000000000000000000000..470aca3489cddf58160f4130daf1ef1015e0f50e GIT binary patch literal 53033 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νj}Uh(I_L0jq`*Q3PdaMi7770e)ZCm}@840H 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 \ No newline at end of file diff --git a/src/figures/cloud-arch-class.pdf b/src/figures/cloud-arch-class.pdf new file mode 100644 index 0000000000000000000000000000000000000000..730b824e086d6e5164a8c7467697d0e73d363853 GIT binary patch literal 43256 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 LXRTTpY{dTusnM*$ literal 0 HcmV?d00001 diff --git a/src/figures/cloud-arch-k8s-general-ach.pdf b/src/figures/cloud-arch-k8s-general-ach.pdf new file mode 100644 index 0000000000000000000000000000000000000000..465f4c947800d8692873b240cd001be2ed970a7c GIT binary patch literal 18578 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 m-2h;06C0+0qoUwHzv6NxyZk9TiaRcTKxSa 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 literal 0 HcmV?d00001 diff --git a/src/figures/cloud-arch-redesigned.pdf b/src/figures/cloud-arch-redesigned.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1e496946f0b3d605c9fc94db45bed36fcfe583ab GIT binary patch literal 31454 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 literal 0 HcmV?d00001 diff --git a/src/figures/convert.cmd b/src/figures/convert.cmd new file mode 100644 index 0000000..bc178bc --- /dev/null +++ b/src/figures/convert.cmd @@ -0,0 +1,7 @@ +@echo off +for %%j in (*.eps) do ( +echo converting file "%%j" +epstopdf "%%j" +) +echo done . + diff --git a/src/figures/input-service-rps.png b/src/figures/input-service-rps.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd4557ebe50bd7296e90a6b1dca9d615b290b55 GIT binary patch literal 53574 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 literal 0 HcmV?d00001 diff --git a/src/figures/input-service-runtime.png b/src/figures/input-service-runtime.png new file mode 100644 index 0000000000000000000000000000000000000000..588deba604794377a15afc33e4c1aa8756d27839 GIT binary patch literal 34667 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 literal 0 HcmV?d00001 diff --git a/src/figures/mqtt-latency.png b/src/figures/mqtt-latency.png new file mode 100644 index 0000000000000000000000000000000000000000..81a16588958dce03846a5f7ffbc1c9b2f3992785 GIT binary patch literal 37240 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 Z-@b=K&QAs)@O1TaS?83{1OVo?yK(>k literal 0 HcmV?d00001 diff --git a/src/figures/softwarecomparison-benchmarks.png b/src/figures/softwarecomparison-benchmarks.png new file mode 100644 index 0000000000000000000000000000000000000000..2de69e7f703b76c4fc22246e2d9126d5866ef55d GIT binary patch literal 35385 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 U#}XF=Xuv;(8_?@nSMNUhA6AI2egFUf literal 0 HcmV?d00001 diff --git a/src/figures/storage-service-runtime.png b/src/figures/storage-service-runtime.png new file mode 100644 index 0000000000000000000000000000000000000000..aa6bfb963a102cfe152c1a0a123b9efcbab892ec GIT binary patch literal 49541 zcmdqIWmJ^?8!e2YB7z`DNGdHQ(hR8}(jeU+-8pnCA|+h{14uKZFmxl`NO!|XBQSKF zd#pdtS?m4qem$(k8V2t9<-Tg~i@-OsV)yS6-$Ow`xi2C9N&yAs4j2Umb?z=I@Eb<* zo)qBa23SE%7^Sd}bPafO%jBiZOB9siFpP7(+rWFs8)+rciHV8*{r#h(qpPc{)6>(D zk&(v6#+sU%_4W1n`T64F;{5#lfq{XQm6gw*KN}brsH>}k!QjcsNi#FEwzjr_fB+pG z9Tyju?(S{`0ud4t;_K^MUS4i(ZJm~u78x12v$K<(ot>1F}Hze6Lh;lG5R z9wM-@`F9&pvH6oP=k2f%AmFJ+*oj+B7Y`cnqYKv~IPfx#K@P9g?!5v0n0&Vl`HWNZ zwkGnzlJEa|dw6pUSSrfq?caYy{r&FN|5JZ!)LnGr)fV%5?{;>1DY!hfB+0VbyD48= zr!7{r_XKlN!`m5k3%w0AU$l!jNv*|}!kjDN1$%V|syea3v!O@;p5uSPF?}^Q(T}n zt$eWy^$_$by{euo5Ah83;@$DekLA2C=QX8Zemda2+ke$uPH+mLcnjHoQq_(Vdfv2c z=VTR|oJ;H}DgIrr&o6Ab=;h<;hDs9G(lfU&RwQSnowhU2ni7c~ox9L72+n#3f{Fr?JiX2ewdv)({|Ge7v>#Bd&YntDUeNxtfUKRwWcb3SYgEwW zcAtmb$=5oBfyZh7>0np^_neo7=0>|GRvW0{&KQ{d1y;G6&t;7D&xEr6s-gV&fo-s1 z%KnbU4{YKGzNe6Enqzgv^{tAzu2JEXeYWR)uD7bxzFwxPhRzkI1UfIs!itxKP%K7BNe*2QVcj}0)w_dAn z?}K#Rb_GlbzD3r}a%PRIr9D9?R7ZSx+8|5bWm^Y(cGg-{<|$K($6bDA{@7e%^F6lC z#ZkpfCiPT>4wJw2Rwc{SjnY7Ox%0zE78lt|PZI~r`7$s3uGmbSUG6B^ViJhSBh-%=$g@v(JI z72^*7szG+p!~@4UR@+E9AL$>%=kl)_Y*Oo}yGJ4R+{#seS!wht>tslsbm`}QXW;py z?1_ZU;ZudBLy*-8&yQh7&3dnyM+lP2(^YA>%oz=9dKLR|acndT5vV$8XrGsUV{Y8e z*{M-kCBHTf;XD~@z9*-BbPCawiB|LMna+7;k-ZhiWx6xEMPgy9`K72HhPATVR9788 zYOMA|K65uF&hu=G+nyo|7Hp%8=4mSc$2rg*JR@B~=f<(AH-f(*i?YAv9g}a3deJJ} z>zpGc**PxlHh2(fY<*F9SHS}1kyrW^~?Eb2mSLiE8tG(;xe8(2Te$^*o`KcL7 z0uNLhn!L~Eb!Ma)*<<-wi);`^a~@{}%)@Kovt5t*cC- zVzh8-8Qc}^bWd56)b*z}vn8)FRo0`a@*D1tCT33S#4}we*Llf|am@`7<{vJ~)L6>! zH!U$2SKTh4(=3tw0433w0S@v-;)?!knpL@@?|vF!HZ5FVt(>1ao;_9*DSdIYq7g^c zAUYO~y*<)f%GEsm%5`mn<*aSW#xqq@WcofyK&3WWzRw0I>}|Ws1r~uI3!z|=l-78y zR&8hl<6J|-oUBt_DzE;^UD@`ALlSduuaw!sF`I7hHJ)tTY6GYT{fibI*k#1d#qfUdH<6~Op3gZeJ4Y?N{MnNp{IK8Xx88q;IH$t^-DY8#d zuuBtI^bQYt!8VGg`VJkjSFN_IV}$A0AXQqy zE*8Pra_^S9)IEd~so1EqPkw6U+{*hF$tee!l}RzTLw6axhRt{}Xa6nfGmdb#CjZg5 zh=Li5z?azD-Rr+VUZE?T!k>IL>$F~fkzD)+7Q7>f_5+BaVX5s8Q!Ac~bhu|!5ftqt zLc9tdvK3JWo|5ju-5m$aGhNQi=x_?D527DAIJx zQ`+;)Mx!8Uwnb?|qoIsOV~$jmO*m;Vql$ib%C5rMXS2oJA2d@Q<9Md_h5u}Zw(H!b z5Lm1ClVVxA%#lmtuGbG$HNPmUa#xT~yEb#89jzN{%z53u_>4=kzU{QW)!I&AehL9l zRi*mNg|H4@pu{;u)7LGjvgwcwDYuZwh7IuTG@5_@DxFXgy4an)7TwHTa`}Bj1!nmD zKx?b3wxO%Y+tt3H>%2EnWmJ_Wn572l2A1MoA~n-MoD!zahFX|9`PANnS-4qsOH6U8 z!eG{xbH)%Vb{k6^KFDA;sb^b>`?i3d**ixN?v~xrd@O#Vb}=s%MNv(@HbIr+(}TlB z0}M{G7$sLzRP>`8Ji{9!QHW~ZgjX0SIom8dVxzg{VlDOLqBHR@jL-0~x;xuh5 zlXm8uxCrg>E!vIpPKDmfxcg)lk;E$^>_Z&#{Bu;!6#>?3>qJHv!z^o~54(s>z1K5y zNT7=Da$v|h(#vg3v4oqj6zy9#tIl}|Y5dr}sY7_-ZZ}?q^IFV4c2&z|dYKTJ#DlJT~?5`XI8qr;`-+rqhOMC;B~uV?cts8AX8zHltD>Jw55KB$PGgq4>r z7u(5_tQ+Rtc4X&-9oC5h*@l1ZApomGOXlsV=QA4Eqa(<^R?E_NNM5^H+?61X_gckz8YM;N>CrTXS*57jR(la%_y zLL5v!F56vqoZ*+NeclN6c~+Uck4o*BIo-hTg|IS{eW~#Eap?#Sq*Lg9PPE2eTj-}J z>P*ST7uvhybSxIJT+5eTxt~w?+$nVm`P+|eFXV}HOan#`(# zxfUy@?7w)}3adLypOLT2KpV3ijhj7;BZ4}^=V>z%6s+nIM58v!e9P~)N~eQ2Fx365 zFh)o^AZR*|e)w*HgkBCQI36q82zzSAD~7l7Zzze`zVYIEJRLwmzRFB+Uq?KX~!r3A}C!3D!m~yyZs5AuN^r23MwB0&X-M7+Sv^4lPYP&4dygutFsdoTb}_{ z`pp{SjvD_^R82)IAKKfhD1XD7baX7tn0Wk-@J=;Q2T^gfx*kR^RqV%`6|1iljFLh5 zE@AIj1#QeH-eiOePOR6=bDyzsN~zL*$EWryFG>lotWBI!v~VVD+9zFf>?YWD$4XtQT0 znjxwlS=T;nbkf*vrDLWh>CoLp?Y~hC6jS}-sD0Q%ATPd@cmg;bwHvHIqBeTY$&uMJ z`>R6kly`NYHA%@GSGrkU^&`Z?%&lNz<@vTmCwD0aqt&NCnTOzk_hCIf7OHV{&gS|e z(OB|Ad&&4AIOOpba71pV_uYI(5}*C-Xd)|3r2o+qE?&n+K7qu4qwrur2!_>k@)ztj zkdTPr@JV|{nQ#48H|IKuX6XFkeo8(!+J*-InY4}S#q-&766-4oZu#U(0RGNzU#om0 zlKOOBm{0KirScI`c|``;x`5c_Y2>i=5y%MRQC{zGX1cYuoXXJhL~gtLm%yqv-sHKQ%FeH_J+oi2 z9wM7ELd5_)0iJj~+ROw4gsq%#QQamjI+ z8v<`TAnQEO6NvV15~2-XYz@1f&FGp|ZB$q@v9 zHJ&+|pbeXf^g=h*0;#}w1!VnR4S@=CH4QZ*d_^!Uf$}>usS3_zd#Gs6S(DQ7Zm)NG zi0!=j3bxJ`Ff#AIn)b#TxIG5;`atUWlSs*bV)bc4&AQx6;^2@O3EU%vWS$N8JlFSI zrn%qor?u605R8#teF+Jeg7s%7!GBIj?j=;No6B z{sbnUue&5+@%C;pVH5DmTZX2tZ@xMM*CkQwLD`uz`UCHC{l}Du%*6B`&z`2#Ubu4y3)1aW^6`Cn&2ScM$%W=# zWz}s$c%u@RY)CaAGjuh@V%yp`l?*H9r^IUgq^1OK3O3&2!(+p80HAJ3`P* zogh1T`OG0CTYI7*lm5bZMjdc}j6WGRNGsJ^%1LZM-nRvv6{S3C;+I^~^|urlk3ijI zCVcbz2eHmR6(YDJXLKPfa*(4zQf+1PB4Z^TZaTg!PoQ$LoZhNQ_mlwYZKW~QBm%i{ zm9!hqN654)kKIyC>3Dsc{9d^&;?TWKxI}!i#W@A_ppgfD!_6jOo#n-*NWmfrY)C+f z&U=bV?WfWTBRWKa=wbxe%G_M2jiYCWTu7^3;^VXMtiWo0$tmZ-5< z)@zrbT*Cy%J&hWuCUbuB9s(EB)0qN3J| zB_~K<}x}dXj{(#cToGULv?~wz}g;BBN$4>ciQ);3T7{MC#}(Qg+oGGqaUK>c~YR>*P<02&m%;)#gfjz&@*bT~va{Ea-jA zf%R(Di9xv+S9c13fxV97OjK>k8AzmREMJpR)BWO8UCLBdlIVd=Vf6Y<_Tp5U3qd*> zp(-&O*1omvN)kRF-p+%B+_5P$P1g%I|0kLV*qmkBhjp0}E9Zm5fmlxQFP^RMl1LRN zeci3tJ2M~A_3jQS#n&=#lis_i(5-vmsRXP1*&%$y^|OxfPAqVg=^ok*2;*W!&!W%! zhn}ldz2zQ5e$T8Rsi~6Ng7;L_V=hX1RZpQBC(F~z(xB0eGVdh874@|;CtdSZ9hjk! z)>5t7#QFwZy$fl%CD;bXyR7bN*R7UD)vbQ^>>`-k$nvtHZ|Bmfc>vE0U_e>Qj4)ob#pX0mOuvnkk7<-s&>r7HJO*C&>f zbeV^#TNKAeL+?wo-HLLq4%7WyB4jmhYvkqxIu^tX0wegvA2%%SV;T z>^OsP4(IB%B=&J%Z|u6YK2ns+dynAKA0V$SydJ;$2)eKd_Ju}ZIF7^S``>MV_P>~D z?$r$*`f}z~guOHSP7+gW(xi*J1c?t1t8Y0ubMRyo;(gC|_mUvHyS0H=9|z?U6PN`b z5jTzL0P_B{w}d%f28?9ar*$k&_il*AJLCsAw&ByQ#slDfv^++H%H=O^U>%eE$RwS< zfqhB+2;PHsRS&1TauGjj*J(V5m|iW$DK*aB`hQ{-t34i>1V1+kTYZ9p;v>|$4LmVg@qCBi?1<$wmGl-0%5L_!CxlA7@5DnOX`)i? zAZcrVP2)BoV4X8NH6%BqCK#?GNVWs=v*`h85ykt{Ogm^e^B6zT!hvP@d&~UC_p|iC z!^fJN9s>Si9IT%LFX=Gf%N6N;0YoqFh`M&rG`t1MUs079fui_Y2pHm$phmYpmAq9h zT~swnu3*HM964^lOc6X<(S(2bd!G?FWgn0)=f9|>ZNtuvz{hQ+7zkbutX{W->Nu$T z7jh0BcVKW^X(r_(m!_Quw%Pj>LVWYu81Zw)xXx#!)`N&G$(y%)WRHw=qT|@~2Gtbe{JWN64<5lplfyL-r&@yuRYHW41gH z!DMaG!86z(IJ@!=#RNO#8yvlY6%p)r@U%+F;{Xy^Ez=-$huM6eCRGsttA9gi^H07HHJ zx{rXEKUfl~Z!>rt@_c!E6YK)<6$EreTEiVX*^$)U2~P5Z-FY#p4``|j8z5ugdOru& z6~UD}L&LziDTsVD0Rda<`zR=@%eR*x_SVd8+#t!rt!@xc#T^tBSjj$ublccNT+z!e zBz^Sz^yAg}X<`%<>8{x&Qo*Fx7u{e9a<@2uz<2gfrk$RR zvHSJbqa)Q%AJBw1WZ&X>-whNW3E+78cA7jbP*9%J|JF=HRJHm~$bOBGAJVAma(7RBl25-ITF&bom3eK`uWr0{uiL1u1~i1-YN2 z@HcFtDKH=I@XY3Yzjp3NaDLQj5tK%6)V?o|;L|>L-Xl~N?63;qn0Mf#D92$wc70X~ zDV9JTbPKozV1l(_oHh^{K{M$Z7%Tbl?{QOaCG2QE>_ecPU2&AUCKRwXS8+}QDCD6& z8OEVgM5_z^*1-EViyini^73rOE4^72$8r+>@Z8MZh)Ma)HqR_|ZuyeryW3_`ic8F#(aObxCJno17>>ihQ zQIkBVT=hPJEfg=ku}*>L1<1CtSE!fXVJjhnfZQ&J0$|{h-~Oi6){rgt)aBR@EU;nC zf?MBP+c{zsZ?ZLe6``W^eu`tAd+ZM@ZMM(>1T{W}JH<7_M|bhbChsPN9vv@1(2L;6 zKg_MJ2684{r0jrCn*m5A-`u7^nU`xmaS*VR3^P3RCY-!ew;x<<7diu%b`?NFo@Vnw zHAL~;^{IEHkei05pak9nb_+zZcT&)JC-P4U-72vsIJBt&lS8s4`;Zk zv>9RyBXfQlfczlJI6Bg{Q8rsM#=t!Q=$}7CnjXq{2sVP1}K)}9!L{5*7s|k@U3(x7@!@!d%WdSMau$@OjdkA#^KPZnn$H2uVH+p8r zz@w+6J9YuiA^GpY7AQUuwz94ahx|U{7jB`DH|&+^-+%C_$L+5%Xe;dKQs5$;)gyGo zJykD$(eJ1!5$r|hUO=P8WW#RJkh)y+#XwRpFYrub@v%3!d5P3Ze2#rGt$pldO3(z` zPqmuse(T}hBOTW{;;W;`a$4TU@5OkH50O3u>*LC{`pJ(ke(Cuc;v8e>_h z<2vNcz#`dJhBX`nZ>8wefCm0OUaZ28y?!V8=MQIYE(t%1^_@@PwCn}z*O(v0gq%;2 zeuD=uw#KAY<0n6lbC}9y-_ zSlD0>TbLE3`KTb~g25f1fJv>Wl*ze2sI+NnF;l(uL|xjUb3rtBFv(CwmQBPil_D;U z;iOEtV!b>wlxBmRg#^BwY-Eu_H3shZg2o5}6W`GfpeT3lu|LWew|J#s77NNRQ*wR! z8e2KyTa;2JUuQl97>R}hYMl`+R9Z?uS^YdRUSG*}{!USKvSK~9q~&AyXLJ;vn}4o` z!_ma7JN!AUPQ?aCLA!S#2T!OBdEg^F{=Bh!F{CBjTK!Enb11gYk*h9SbTz$0_^P&I}LwkPr|kEd)c(^PMM~cy*ZUL4VCeQ5O&?ZlItw{`nM*OTJ_K`=aP!N)zKh$>RJu;PimE{aKUK;Di8e7&j!i7 ztnJ!AGvA0j)?{KuPS?vrH}_PA$;)QTIOV+^77AMP@5%gEtO>Y>Ez- zP#gsmXsy9xKVitMwTL$XHYo*c@*^AcVYN_CQ{5m6DdrywiLFsKwXeyc)cA_im1#l{ zob)=`&#}Q)Z8- z_(lPULgVB2C{dr5w6uJDUza8Xr0>ng8VdMq4hG;Y|99`}qj==;{9U$;-zh&8x;NuU zV0^%d?6Mro!W#`@t<{H!Ty*V8rLcWl0R7H(Y%?(&(p&;3APiAKHiqO za|HU6=wbN*P8#WTrPkE7pxmKxSRPygBe-SagGo z@W=vFu+JDq9JQEM715&ixf!Km&I6TgwO5}O;GXY7^B?s zDtPj%3Z{Pjui*F(@#)mIQmfk>3yHYKYB&-%Mi|Tqg-F?hR^(Nx-VAB5-a*FPhSonP zC$XlGFq2a=7;8-{B;{Nfs~?cgo2K*GOc?<9=Uq1}AZh-0i@OKbi=y(QsME2dbg2@K zV(a?!(hqT=I>F=r_lh|j{Xa7}Wq2c03~}D-#hlkq;8!JD;owh4oKz+=&VdAE_ zRGu*Wgz0Cw_$ub=jBU?X5Wise=Fc(DWA>qIDO9fhOg1HY7T7Y)wD3S7CMx4lNr7JF z=d`$jv_DyCtI^?F?2?J^JjGxq1A3w`~7tu-hUV~ChS7_%l+0vvh>y@cQ!2WCk! zix*%x1vZe7{c{wrPFFFvFWyz_*C+={JLV{|yHDt;D&14coOBdVS2xTm)5j!f1Jz-* zA5ZU#akKW__;-VJU?!Y0-xG3f68|Q@_|1-O;Ii`py8jWeDj8`n_sY)gEenj0w40=IiIxW+K z3emscOC&@bYzGd(#Z1W16LUI?IQ~|Qj9-7I=NORcQB@9c*rMCKYk-(vn(q% zmtO^4CV%6LB)!xo=MrS&?8GT)$fyF)GXH0=*qzh#fi+?bQy4TxD;l2IE~Q+el9`!b zb61~r^G|88-aVfsMwyTM1EcWaq{zyePH9m6Q^r<>IH^Q=Q47VoO|FvNSKO(#fT4`r z&P~c+4?4|5E&(;7G%UBJ)p$KneQqKEzLIaG9G` zih4R+g+Msb^b-;pDlRchH_O{f7u$f?ruWSb3z^6Nb*JJdnxfs$nN;p^CT>&kW%cY1 zlEt<;u89W63%9oYHUYJNo<{2x1{c!<)))n+_e?tBlI*p3dO}sS`3VE|w@>dP1E>EI zgwdORxK-c%9nui~hCh1mylA$mPIUHZ+{F?#qt}76;pIJx@@2tlz^wpmx~|CymZ{#( zOEe@Vnf`*7kcFL_ANr(kb$8DCiOD(Zo(X0~`gA7kOyPDUMg6 zHvUbBk-k=L83SE0iS&65)&~<-=BZo?451ht2l~`BB_N`Vy9xMvM|{yc5=2%k|I%G* zXE;-GW)3bRu1dK`X*5VHOU)uTy5xQ&L!tSR4u9W*F57hfwE^5y*T5{i0i_YLO z+h-6cv@)xd1qcd@L!EZYmLL^jVZrf5*Fyrf+`L6vn53zKr)DW;1-^>Wh-iTe!(wHp ze!-)bwhho&SXh(pgUMh1_3vGM#jK~z;P3Re?Ezm3k9K965`COpcjAxf(nDfkg9mQW zF4U!d;~I{`7<^ei#0YAnLIX{&<`)!lzH7Eu|4275@s|N`#--a2^7g1bHote>i$6W# zlTwaUpu&K1wLILw74QCtqo0eF8_r<8W#o^v*~A^q^mlzV@htz@PybxZz_QaGKVHe* z96aS$BFe9(7qhEks1_yfKU5hFdTDuCSH|eb%OZ0E)NucNROv+0D_Bhx@m+SQtq3K_ z`(<^7_~h!x^6E)#ij3$2NZaA>J2~2Um4sDSvX{VAPg3a*Pz`@`H*f`G?Bt3M9`vK+ zmfZ`B{S4y|GtB0C2^)$DaF|x)$?2TtnOB_dB&i zaEfmle2T+D@|~^9Q6>ah>jr5Sdi4edM)SFjcTkuG@ll$1(yGAZFqEnlw-_W^?Bc4r zogj3zIZbWq<_* z7?lGDs@V?GonELtY`3}Y_?rhSXuwfj-|>pdT?rh!gQ+Ljg>Fv=btsr>1e>P*`dks* zHf4YDL)i6YLTW)_!Grwu$y)^_qA*1aXr`vQyZV>{5Iq@i=+|4vz=g+TH&I^r{>fqb z=VO~?c$0adbWe?xeKYJ|QRifyV)M%o@14&&PaIaw6bFM!QeI5q7^qN14pG5-uqYqQ$V=9N>Q z&7lSi8HeK4nS8W*Wk#R%a(WAqCs737)m3ab{f)@KGwqU+n`yNwk6KqJ36pa`1+c^; zsA5!4tUA+flMvX>0U2NK62yC_=rTeMS?vD3<8{34ctO{!U?O&{H3(CgSejAgqJzv~ z{?mx_Qu=RxKp0E(w%H2iO^OS3KvF4xOAxV`7OS97I*T~?RMSpQa$TSB^6PRp@5nF& z-$xov7+7}hykMZeo5pZwgYQ3JmY8mV;K>;WDrp~MW?1MYm6Zc$s*QX~xqitppmsNoZki$sK^9;PMuNA3^e+ z^_Zfs(6?uVEw1lOOkyRuEpP8*DLH;UIkx)*K4WlXNwF4`qWmna0I0y4c*Lq9-6w9m zN$LFy@A_9fs=I`~&76D#dP)8l$RO2uOghx@Qf4=aOKi3C17odShN&fCinm$BWxNIa zYar#S60GFA(^WbD!T(phXP_CW;LpX;qCOv#nC5TOm#MsZtdWvUtqcvte@0vm_~djOjC2n^l;lce1W8j{})m_XG%|LW2l644aQz7Y8dl%f; z<|B=d8ElsLp@#l3H53`4j&sBzZ@B7{`7`VQ`GNyr*h$fTXK7eh;v7ltxN-`9wH&EX z`(~DxEX_UTQkn@$sg^8$Q(w`$M?AewE=Y;jEQuY)%}Om0iKvb&Lwsi{cA4+`NKodV z1IbJboEA?5L}%SSr;=-sx*1Tpen-8k;G;T$btbd6bk$6c_^hjYTbb6(QpH^VN%a+3 z-@SG4v+2C2qZ{EdeUD~0z{k_XQlM6}+qV%4MgTX!lbSJ#sZzSvv79{6{NtXCerb$& zywi%FU2}dWGov1jN`fwvleh$9EeJa&QJ|}+Aw?vqBevBQ5;f50_vt>MS5(k$mAv-> zv>QfdV55}x*UBtDIeJPFY2BAv)usoJuqa3?56fH{0!b;UHNX`$BMswiflW>17ZRLV!N0O-j zB5}s~j1wMC$D(A&gHUR*#|%0I=u%sxW`;O9gyddD2Sr72%TpWkZE%m0KVN=EHNrcVx{DnVyJM9(E$=C6Yv`iKvKK-7(P8{pzImy zeF4@?@twPtvIbCZ8wL1@SFL&a@NT4q@#z~W55*9hvt%#;c8tscYMkg%iMSGuR_7!zsTMkb7ZLk2aNuq>SR!oo~8*0IQ*KseWak=}A0oxbAtB2vjI z_Ul*f+vl;C>^t>fD+&I^AKJ5P4*gi(H+R&Jbw35%c zzUm28ojrrM4D|uRuEnMy1%^*Pq;~aH#UrW+xG>UKn3-q{KJ=oKyRTdFXMD5(@hEScq^b(zFZ;|h-%ZaAH!*?;r^xvNE(03{{;|asFKlf zf}Q|sOQ63WBuPu3ILOcZZL5=V03ey3016?MR{yXX%-8xW>h%B+S(7d`FQ!WHE}TQo z$}!=~M5}bkU4BXxWO@062R`(XLcnRK*cST+ivJ%%$)CnnW`RDwqU7%9AHocqlU+)L z?E)-O7R6SJNUVqH^h*%x5p14Y5nX4w2Br(pwIusj0egRT`X=)upLyQWVkq&tsbRVr zk_8B`3ss)L`0pon=(WhT)o&@4MoZMuW}u9N50@$s^^ zA64ROA%mJme`MM8k9U~9AC8w7E86%9LvfSPC<51-G$cb^D17V__}<*`%4d4##QWQ* zJO7FPkTWo@jbzlMRHP(S={-4m(dUVRx{y79Pj2G$%=>s;d*zw%{XbDSrbUscTyhI) zD0hL&mB}vENvTK%t!3U@wCl^P^4kCT(|QyseEz$s2(ZhuJTJ<4QB%o69yY&{%H!=w zJp92^?0fXch!0R2j4A2{_0A18Aw}@dxBo|y=Q`-dP3Q#lbQG@TtC?3Y2bW$76b}Nh zELehAxQ{iiZSSOq+_`29VI6bHJtX~GcXLc5v@3!cgcTntsKpx=_gJM$U;@Fh9N=m; zK7kMGgHf)>)aYA<64M`Oy`K}CWpK@~%8}*ayKN$<;Kw@cZ#T6A+`ghNLu^o{sN(XY$_NOg0%%llqeZ3-B2OQeyHc^m**Qxlp(L4dDK~cCSFXnPXK~*cMCw5ve+7a;f9@l}g-h z1t|*aFi$J%DW90hkHnZpP*HF|Ra{Sa{Ew@3*6=+WR%_y~`}I_4&9Z&(stPqljN?6_ zCj}A=B+9pc@^3SIh&GQ=)$Ml`_$9XeDaRLxYGqe-swEg4XgHM1Naz`)6W22t#5_k+ zh1F=T?k+*%kP_cN9s|-Y^=wSqT6WybIw6%(K9Uq8Rif++ci;;FMvSz#A%*e@Py?L< zy* zI|*YK^UUW`+Ld2Ra^*iWf0WD|4iGQVId``ZL%B{VEJ#e3(Scb;wC-5Qb=$%?ZYZX8 zOCw55TVzy7?WR7Vegey;TzbASg1-S9Q=p z2CsT`I1vM~oCDl%TZ6M=@lg)yb{Of-^zW}->$Pbe%| zmSA)z7@7S8rE2gqBvp2~^p`~C=Z&TRcV1Z0kAFO zs$Yq&S9Jug{GH#Vx9eVr(?h>@7VvKr4zyI?8m|D%YY71vQ#>5OuWoS_vvm?b=j7@}nIC z_58_!YtM&?k!%*npK^8?ZuB{yU50<;8lE+5^9Fj8+OPFplRNTxc(MD6^APADmOY|d0QgY;QNc~9) zREQ-mSk7H{?z-y{fz@Q%%Ae+B9B!jSxuQ|?&xwYeRSgKN^>OY;1OP=gvZfE4;iv_= zKmZM&^u`~@6Im5?tkexeX4Osy_0OH5-`+16r$PyTB}qK(r|~^~zF61qof@32l-$!x z`H=o+kF#0t;v0%6KKfWg8h|frUflrEc};L~nQ$Yq^;h-rr{3*Y5{k{|Aoy4n(#cR| zMo&L|_sVF)a3HR0{FtUx}K`GYh{lQ^e_Hj57e*A*TNR6}*-d=neT7 z!6?vcsrNFEK1UC3JZQOYj!H5D)2^y{F= z$RK_Z$ub5Ok1{H9FPwzki~lHcrns(DY!MpN9sr$59n6qYB&vfA@Cjn2r<<sU0}v=<$#F`u`

A3vsJcfL-#hB5f7 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

GM;bF=ycz+e%83xOO`uw+ zV}AnQ_3j?ox(DgEiLOz@JvEcV8Z#{jV%+*}B`4>%KcepfS05GAM}K|-}X3$l5S~cd21m~i%OVv7Cvh$fuBYC?xp4JJ--OK zyWD5ucJDJEk}~)Z)qpW^G5j5Lq?aQowjXd&xu!B z#Uj6hwH5)IH_^M(jY9}eKr!Kp`#477=S2a^3l=&RWw!i$K?A3z^GWBRN(0#P#J3?V zms|>$S6x|^O82(&?`?>mZ=U?!$qL;baP2(n%W!Ffa8qqXtZ&ZvT9>-~XaXHBq0!hJ z>1ZI(Hku{ldIL7u66Pq}J#E#pSMGxB|F6Z9eb z0&wB`Z5=$DV8KaCCNl{w$+(aa&8dcJv#q0M3ll| z`Wl4BUpDJ~Nuy9J(&qzgT3+Bf zR`e%->BxCzu|%Of;)_m7WA1VpV)?%n?yo@jt^EbMU^)5mOAL|ajq0&iY~RLum0i4k zfqY~dp!wjfQbbm&eS#GC8tZ|&6vP+TPxom7@}YSM#ivSG2>z(KC? zy6&0T1F9KhG@(B?lA8HtbF_#4G6xPJGXv>&LANSb1nD7)glUOvu4X-stjsr~@ETB` zHWe{T@Jv6ATR>`2fb6J(NF0oQVZF)$NFScrvzt$U_a~683icKsnB2LN`|X6(FgF2z zZyS4s2k+m%XG5(x=TFR=iz{9qFxxQDSh@y&n#7jR8q5-3QcyVB zFyib*)u81b$VgvODV|GS&9H6Dmb-Us2&jftL||v(>PWuf*1~t7k{NXpA5a4q8qJAb z&z*4fXSWf`D`_g?jH$6F7RaDi$s99zl;*+d^bTg_ZIbEylvFEgAs;04tElk&+;+(M z`2~(++Kn;EDsL06b2NrO0+Xl3l{w-=gFwg=TsX(0o88>=*Cu}@(uTHW>`V;Ofh$+4 z1*O*vPN$D)y_fa_x8_<=%3e{Jj$*`->FNNa9~BR2~>FkmiFG-+vUWO%28hSRsIRAftTs< zf+nym0MRD6iaCHC;GJ^ZfJ7hnTwL| z-suG60FV?ANk6%<-HLoo^ijD=1sxdAEgxfLz4Z);E?GQI4}5kri*<_i+kUP0T4x0< z>Iy8Y5d3P65?y0=)B&VIG9Et?Tt!)eiO%wayr0Mp5-8p3wZrv&0s_{X*(KCcpMM3z z5I^3OUF~)VJ|?7>co*?H^?4ou)bi;3c<|a-cIdRuS5Q9ifUo?oo&3_hb7w7PcvC9h z+dp|rD09#sXy40|oweZrGr8(VK&i$MG*=pB1QLJ7tZg ztEu_QDdfL@9n|`QJZPXm`c^+FQmY2LEr-i8p|}RxdYk(cFo>6$&Z?LTN!08lWPiLt z6#!JP}K@FJZU~*@K6NllL}y0dzRo1yakVo zt8zQyid1ULRC&;5e%F4|r(cAyWg~LP79s|lzje9R!#cAHCQ-nN&KgYlAzRx%$SHwP zGfUqIZmHxxrV$A9i<-1%&E#WpthF=-9($lG0vfeGzySiu*RZsV#SvwgEpMrD$MW4c zF!1B4$di3c@bdyXN+Lp{W%73WZ>BS;9mKD^9E;o52#>m<*kU%p3Luv@fDB4s;C$!} z!bc@JlJbVGUt*;8a_lOA^_3zMc#tSeFT^cdAL zEi?`Kl+KXc1hweK$8~#}xxqh`2g`GX-@Oj)A<4_9u&GS?Uoe*}@`P3OA{xCgVkumL z728{IQm4f~0Xw*o=cRWr=j6^MkS#cSMcLv99rL?`a>QmPBNP}{LA@sUIp`Nx? z*DQ*;bg0y${O(@QAmcRk_-ZvM1F0N-0-u%+IXtbx-s$}+EXAgE6qAztX~+O+$;LiM zMUozNE&c9zDNh!}u-TXdk-x8@p)BH0?Tn-pi4hk_`U%%YN#vs+$I7+;Vv<+ko}nsU z8w8`*4Pk zpc_)|!$jRJk3JN~Owry>|nG*^UCmw=}6Mnn> z4r&$BB381_$7?Lr$eBFKI?g~5Iadlfb6f+KW(~ap`c=mX#f#h&8*4~E1*xp(?Rt&o z+i%n813b8op7oVfrxxo5jF~;EwsyCSD?p9_c3F^WiNi_j$Tlg}qWYf2e(92TI$qbM z&?JPt2o!imf$>!pMeDQ<`!z&NjeLPaZK9FIV8w)Mgd$geS9LZps3&N+f!uW3lz(Zl z>(7tJ^m?6@yQuJPXN^8z2+rg}6)g`P)a|y8)6bemuU9<2dUe07;C`Jg|E`g@>8N%X z^6iLU*joUNLhTm2>&20TlEKZjBS)aPrD}NbDWl&lipW8KE#Rl8G^FGN`#A7=W-U^As7 zxUKhJe`{gQoCSj*qu(Zo!E=O&t>*Xf)^W?4wC>Rt-`L_43?eXAK?AzfJZKW)5a7Rc zu4<>EaA!ZzC2hOkF5vd0lV6EPo_PZQUQ}u%&QW}nAa+=S+S*sT-L8cGg+zInHDrVu z)h`t9TSx;(qO4ZCt2kZax$BMb>V5XZUjhcp7x$DO5kr?RfMO-cjp5#T)fqMcpqeMe zAssWc#UOv3|!sbBk&#XY_aHZ#a7zFMu@rF=ZMBT0u$xG;yv?-BzK%B6Ac zw2~1OrsWb9JJ8UJBx}y}8Di zKsgy$A;BfdEP5HJcC!e;2PItZ?I(q!2C{SHSr2^x1*ZGB4Og{Y8a>Q&hKpXPso`6K0)qmnW%(H}J=pXMaV? zXo5gfjf8%qEYwEXz1(XDbZk=z^Z`P}@~cEaB_>Z;34#h;>nRhN1$meoRj7-k9W`8m z*Y}0P1eGSvfE%p$qqM~-bsBsK*;ezS>Y-LI9gtFi<{#sI_WsA9?b6~g1yJ0fdtw+5 zbt`*RlFolcw}VU1>BfW^<^6Ir2PqV+l&u;<8_p}?!@lQ#Ww~=aye5s@gfHAES3j*A zb7=|tHPk0PsbLL%9^B$cC?Ip5E+BZ4q(r*HfDs@vKjg{nwzMGu%xd%QP5ia}1KBtj z`wMq`M85`}?x0z|IH+183coAGSkG;dspq8~T*{lIR;HiE=w5)&(QKYzYp~f8x#WMAQxf-dkOr?F0jNcvK4!NE__QL zMyR*s8V8$L9A$InPFXiGy-zUtYRIy5F~*EIH~|p7y?|Zsovw;^%yQCjZL@u_$=5!~ z&b@>mcNw)h7wde6i!Qf|K0Q+`iHgFgm>hlmLwo<8YuhxFyTXEfL33%x5ATvM(*#%t zCWui$p2f=R0|3#pjEX0JzAFr2W|V25!J3xU?spmr$$S^^pW%W`>+m@RO=bbs0-$pS za4b`vbK^LIx)!?zT`1z=K^;VOw^as=zndKNU>G;;FqsIykx~& zF|jmI4b>toKZeNlm_0%riNdmErM*Y0a2tdX0lp}z5RZaH%5yi{Iv21D_8c_&oa^%Y zw;@)mN$-+pqMF1|tH%LJ`Suk|DsuS}Bi3;+eYPa(7y!?q-MvoFt{<|*i1f-Ti{#OXI0#hTxjlit@ZT-*{kGWvCuuY6; z-e}VfLOEH;bCl;L`{X#Y_898)tM!V?tI*sfUXF^)In&&uzg88SxSarsJMu;v(8x9Q zP8}ukuU(zjVf~e(Ykv9q%EvKkw9!%?yGl5^!$OVKkA^e2d+LqbtYUW($UWj|;6o%& z^03$M-o1OC^UlYhrdi`*ITf9ziIcKPr?YvtC~3aw2zK_q2~@OD5Ga>8oBBP|a&m|~K}wTRtGoSOjkjO-3;f}74xRaSf>eRkjwe+;Q;{3% zzy`ftdg^2A##Uhs8b5Gx;<78dqnekT} z4j+(D=I(c{6b>>rop!D_uboO$J)sTGw+%pVEP5&=PgS`CXpp3JR0PY<)!;CXyM%JP zOq^~vq|C(;=G70bMjN}@XOH5$oo`(PIjC2w+3>ClKD&n+d)R(vorxyzjq&x#BD(rk zN%=mcBSGX6r|BKVYN}NjNOJp8?-V#hvk|IRn5GpUI)g!o z;|d1WxMz zQh0#|n3gpJ&#fGCfx>1w0`o;XnNs6XOfSo%DHngxuYPb)>Bn6C9Rz8o%{K(U#Q^Vk zXu#k(X&r<@F&3Rb1MQ|p)tM~cFrY%}mZHO|fX7(7f{*4UbL6>VWY*!%DOfa-lazDpA`09g?)zW#Su6Rz%8aA&r_EDj_j|fTVEct6vAmR52(9Z!2BG@n&N0c3WCV7nYz>);;}0wx&OB&Xi}BAp1M z&5i69$h#SA9;tuvu03?(4K zR7;R}IKPyd38+FgUzDI~lbob%>&2{0j)zb|jUOlBc0_=ID~*O$3i-JSuLrZ6tdF6ox}TonzwPU`s>MyBZq4BVl)Wwq$T zgW+GSYFYRchW=j0z#LKqm2C6N0qO6_qJu2#GJ-U=imnn38UGx~vEJhg@|CS~N$B`6 zxb-@AypKY4MUJB9dODSkS0*pP51YvJ)pALSjnb5%U`^WM3a!?0sRD-)^f@3jP^cL5 z{s~cRpqsM^Fu3Sjyfj05JMP9d28k~6gLzstJRtg32 zhcr;(AC`+D!oGfjz$Ph&Ummnh6yb9w>=9$?cdiehxdC7eF4k_?pJBl~i%onad$-O< zx{k7BMr<3G0(8=O)d>96^*5`PN1z3f z3i)-m=|P_1`dpBiG~hoR6v|scEv;5Nl^trb=qvw4Ncjrdm;Fz3UmX=?+x3e9C?H6R zN(cx@i*yZ&APo}IAq|3{3^jC0cXvyJbcfPI3?W@Z4lyuv$9IoD?{nU>&i`k9Yq1vV zo`LJWa$h@s`?tkLgS1J|esW;s|LAqAJG2skPE!FzensD7#wb)+4RST^OC-`EP1}V5 z)%A}TF0L_{q;tsxh_x;9m@v1H5OF&eXatcetAv;SV5z8YWsL> zb5WX~#wvDlX-P`|i55z&;WHIVX-x4B|H9)Mt4#21ANl1+H`R+Zjo^{>sr z8l0>eHh`mV<)&Jgn3?Nx_%QZ1P49iu$lS>eL03R?144d(SDmuR*n_nIc~|uXV0?~6=Q93N zCjKQMlaK%7Lg`(q7%>^P219yndQ+B=HnFN0CgJ#L6+m0LwE+9aQJ6$gs;nAVVE!Dk zm1Xi2`i8(Umq(f&2AH*2Kx)`uTiofK-9orPHAs_|eq3tHL|-SkQlp&K;M*&8T(rUj zK--s%{#XKxsHm>^78Z{Fev`r#ucf+1wd34`>-T%g|9$X?6&EDf|y z$J69YKa^&cVC*i|Lc0e4H62EJS3{j1oMhq6H2CT$F&tQyYuQK8$G>Xj4<$KDZ%zA; zH}>M2abDeK-Fixb#lfsJRRMECE_>yilr13s{}r`N8y8{b9+A#oP%_wUi?qQHk%6jV z^gz)MvRhFAjt9#Ng`lARxKE^I`_m|F#FE z1)5k&IMC$9m9(?7A`wsrCh5Q;y#R>>WlmUN0JMg~ zG1a*ad5zw;ru(XLU!WLrsYw;P3p)#c}v^zDt=;E{8;hd zcUB;>nItJGKsKQ-BA&IkxKov~7+rdU)sPd6wNT58#yU~`8@E}yFH8iv|9%)tK1fq+ zCkbWEbflDH+mIzut!gp?Xl(yVnrNv-W&>VpHcFMgmpWB3y$|BE#>M-7DEI$5ZRYvo z5W`Viq)q9JZe*Amr43Q5dQliF(UuG3r^IHV)1m)e=RK0atOA|r`bU%n!nh@4WzeSw z+7@@pzmPtiMf{&DDhd*l`$B=uBv38rF%7AT{d>U2ujy358c%2nY}9`Z>-%{-Qp*zM ztaLjc+~ZzWvMq&|&f=N}guaqx1Ed-{JL-=QVu|{mhHAYf7x&7W*l9Wo5#~ZEoRtXd zispyG<8N60Q9}NBA|glYzMlxv_NE3?Y^lklkqAWHHt+?av}#Q+2npH#Z~bAJHEmYp zV_YLcb!|d3ZA}fYt9Icl0YkJ``EQ9`3^`xMy@#+ZdzukGAw9;PCCk3@?v7YVT42Mp zdjT}z3!(uBy|ecJLEk(Y!R5AYB?^49RyUN5ZwF*f(a=XHkd;G#JBPwFg^n`pOL@dwjfyt(uuTE4QTc}wI||h%2mF~Xr~U}BO2nV-xCg}Sbf)IV`o5ZzNpgJZ$~!{8e)1PIOj1s+h$OCN-qYsU0x zZ7?wLsc5RL5UA5omZ9}lKwTdUbWYrVvU4Kv2joBqu*v%SH^+<@QvmE@Ql=GAG&QGW zIPJM#8{>c@>Q9dN-HfL{RBuo06#}l=ySZvDphhbYzLyv0=hvXb2*awE-GmcHy0dOJQF-17N0kU$YHp7FN@1_BiHxUTXyU6!0-rs8v@>plo#2&g@Li_ z$p7nzVh0ShSx^;i!NS0RqrL=uRk(7oTnB(R@NnCJErGEO?i&Av8uXVK6hbzMEYJIM(f>N6)Or8O+Q5)yk|2@${gI$75+1Czq9X$S%o%G1UU) zadrBedb_*3756*8cT%~r!H+JD^|$LiIQZlA09ovr33J5^Ole{~l}IPv(m=S43Q@Za zataKaS5sycBa4!|JHjqb4%=Z;@LFIZo~<{h!KEOw*G;fY#VC|%X*p*vG9kLHJti9w zHK=xULi(ZMs~ob`@c#ry~Sju{rQ-+1UN`8{o{tHdi?=%)r?`A2U25qful5w16t!_2lG zoYx!OFUb;+cDYfgaUxoE5Tix6!C@S;EVSLx9EQrcZV^mvwZYRC?6bok7+{^)YfonV ziSb1Q`(f?;KJVA~5|yd5Qc ztJ(G03Lw#}=f$MxS1_Ko6&wqmIXu5I*0+yaG<$i_9io9vj#Y~A+({lO-MYLu(Otb& z&r&l}JH*U7_@S=plf3Qd?Wt({dP&|AZw|a1oPkP_bFDUoT`De>MYnwHFjSE<^)ROa z8QACsikHMj$Jmvv{EB;&RokC6Ye-o12iaD{kmFHP1M`THB&Vod$ zt@w(JLTr>(7dmZQ{2mlu%1bowSG?>_3}!c_GJ@5*)=28(PGZlGG1+sG4D04xKpm8k zbo=cs)gBAEHn191`UjNYdvl3iBxTpgZOY=BD%nINxS zh)vGuadDttstS89%FjgSq4ct`wJlivriW*Ou;X>hTNiC-vvU3pMLV?f>L!e5pnW6n zx@wOz__N?}*=~ZU^%sU8s(#lOBUQs#H6OLU^N;6I*^L+b&PIyO>_i4QlnfJvPDP5< zR&E9MX80Cq7r*9|#=e{%Yl2IALGvkLIn>4l;Dhr#;uCQE)<&W1N!s@C#O-6Rlhi~7 zU#ISeh*4>vbcDOy?0oAhMLZGVrHqe~c(iJrvcn;jYHQjx90-;&F@(N}G4U4s3HJqa z8C30ET=8N`>u;R2yQK&Wx0z%Mz*CoEgm5fxmV{Ve>{QiX&R2VJB`PzO%{^M_cy>!y zj4i#_F8%L&d7DuZj1Dy+N>=PB!#Q2x#j~x#unBGIB$Lc4<_(c5kZ9zLRiIK?woZ3u zJ|({nPa2^xkSd4q(?;f;JfD`(eJ1$l!QmV^R^(?N^~lO#fTxAAwH{JELI>&Xpv|3! z{@Es=A$&_dk?jW}UnX}GbJcq(J8cOHBO6mHKwc^QR)wJM&4VoKc=|2-yXRJNS~$W_ z0YP!MmFW(I&heZgs3Y>1bcdXzDS|!kIp!-Fs)t2QbAkDixJ7UNGmIM7sZbnh8QZ(6 zjS1cj;rlImQ?1BYdWf4T(F!X;8Tl2Fg(k?i`V~QaM?O=Lf~=PrpgcS~oqN>tv>wQd zp_q#4YsuCLP^w#&s1& z^;dHD7fEr&BLbj%NFI|hNHu&4kP}0ExvpMbkqX(*ZEr|=BZJm-8$#kvL_0f!sz-`( z1|Azb{et(a&}AF}g3q_#zq zJset2wAw&lZa#i*cTvL=we~%|x7;o6K>&Tl&FJUE`?*9gJ{Ew!jm>jFtQ zcGHFfP%Jd~FBkT%L|*jmmZDghA}WQO_PKJ6!dNV^V<&#rjIl2^Y3*78hri0k>if!F zU=<4B;{h6Gqb{KN7NBtpuPRJ)HEEVxY+Jay2OR10>foDd&(w^o_b5qFlpSnkSW=+v zGGQI{M)%u^8>>vFoq1Gc0c;owq1@;Req_?kK8XpO0;PF3g~w(cLP@lH4m+|5;vh`b6wUPgo+u{A%V;en7x15#So@*diRfE|- zo52ZGmv$%MJahm!y-nEy!~w(I^R)$|ftO+tY>q#Z`qo~pu6#V1TB#urJO`f#4wIbM1D4Z2^M6CKoMO#mjHCF%j<8|;cP~_zg=pgbgf&-emt$9 zI|RL~W@Yat`C6ktTBWNR7C288V#IbNRk6EaEZZw~T$$NIBCuC%a#hb5*K1d{>R1NYIQ*!kgeUY@0r&+nxc7DrNlyct`bZOA1D-#bG-HJ1~j zEmISjS?a$U0HkmBG$E7yXp5kB>)V{UHKDDw>(xZ9;i8S7osxyWt_GL#;nQFHmFQgr zAe5^XQzK`_8mPNz_`n(QUg$M_G6#~paeA$p0|}bC7#Gb^UR9Qjk~r#$3wS1K0n?B) zmSsyX38_a9kPaf5Ln+sIf)uK{lz0tdh;w;KX(_BYVOrhs-S2ny+i&<-x~$ZskSo;z zeMLQgO2@+_VQ-L`B5;L=TrJ5jA#X-qL_83X{o0m^!R{Ch&qtAC!%+g*!?vb^mu77X zM_dOBSjoNIFbC&dK&)h5i3w#X%v7CJ5BdDeSn)8rSu`{TnTWVPm;9nw3`XA3~8HTNt(+)e+3VX}73fSr~7{S;orDaCj58I39CiMfEf%sxn|q6 z1Eu#jJ@`Oz4pXTDRi^ms`*MwF*(3dHBaWe7+=+y2r6J82Rg>OU~qA(D@P$foHhoD-ci^!X+*<0jq$qcFkz^ zPN3JT8#)`kEnD~Fcc{vBFqJD4+`#D;Kpq<|Qj)^lU$x?;PiI`dbdFvyZF;i?53r z=J+3;Z!~R#caX&=4##n+7j2x7o3@?(^fPWN+gb z=V$Zw=pFUr&*=y2vbPAL!yXvfi@p3i)D+ZRu&6K{V$h_%usaytovRf8~gwu_I4W~#ubV*vt+NnI+D z>7NISRVFSzay-}EfUlwb>Q^}ETBHr%4d3bZMk-rGW5odK`MDVdhUF}T3C{68)cP8i z8uNPTD8O?NdpqEtMF@Z6p)cC=P}Qz6vS6bKPVv#vXDQ(D~*raF2$SucC5Y00xhWS z#Nr5S!MRZAaZ_+K8AQ&Zo4i^1D|RB2`XI|?G8G+UB!(cC}p-|8sh-(3iKn#SMOVVxah)=QZt z;v~&5hq0Z>{KhF_sC|V*_PcXI9J_}zU!JqU`R!AIKK?vbE&R9o(|S4{CUB}Ii#{wm zNnXel97V*~;PxL9)GFJXzu{9^)ok=^E%-MG}Wy*i51)cSlZDV;oi%m{HgI zq)XqVDd?%Bi_ILIX*Z5{RAYzxm7!TDp@dKTDq=_R-6GQxE^H+SE@upj& z_;NN4TzU9nmldlpAltXRQ@cn> zH51HRg)E!LI)PNIcIG?W=AbQ~uNa$;Hw$)aw5=i;LE2>mNoP83=*WkSC|u2Sr;W+j ztA!uWH~a*{m-DB38dfn=-@aR^N?{WYCEOqWuva}-^0D+G_T=apcmjMnr<~gV?B>_4 zG|P08-jx9lfpmKH9|PK#&~H0h9!BXLM=ksosaw)%V)Kb+t$pRiI&qPSTH$G%v}4aZ z2<5$+iaT7x4{(=*7A)M1_i28ScA`q~gfVP5xR%|Do~9g&HQzZB>1~w46A^bR0&fh@ z4@NaB+Sm!u8ndZR6Rt?g9vNc_ykAXV0bk{wLdnwxa)0YnO>UQ;gllyhf~%OU<^-o* z$}oj-r@QQ)CuUa(g@!m4brW_ucumhT zSd#f`I8i}{&W0ypee?CV%3dbAyNex{Xc+7sY|Pq1MNBJ9z!0UzG;mP-Ajj|n5BuXK zA(lG?&;0$TTI_|MHd*ae6hTY_=QPyt@AH{}wslJwE3Fn{v+3be$D5PC>#voe#2tEy zM}1zD?*xuRH13F0Q!8FFcVtuuPB)@^Jl|EN9+zB?ba-Xx*hSb``Ppp0)GnEglPZ5V zNoU``6ybW%^}L_dyz)Z3c(Q`SkUA=ruesykGU;$JUY%I>+$E9V+5MhN2hlEB_@@?D zYJy-&1x^TNc}LXK%C@K&kc;*ppHqFBibF0+M~ujK>J6(bi?!)U7X8}}&R8|`m3R_| zCK9c2y#{Lj=JQod@C$0?T!M;DOoA@C>Ux14p7wy&jv$U5fvOu*6`4?>@b98l zccc<#DzT-pD_2!AxyU2PB9bC?5<~zD3V6H zmP06$`9>UFU5%kLiBhOv=by=APCiy!PZczYJBQcUn9w?ujHwBdX5TI=1CjWMgh#i& zo-$~DfOy)}q_XT(z-uQ?+`Qe+!>zt zV1pOzvO{N@L7V$2lhp#Dt5=k4{9$(k!4Bp<;_&GA)(RErjUio`ZmrUZ_SX@oqNj-E7UH{WQr zMMv^EPmNpT_2T0sI~ag7h};u6mCmd&mq_bZU~Z!R_EsC$+FYpMSjSAi_(#W=@+iee z5sa|{{R`#LGN0|&w5oB6&8tqkPqXiaCnEfNZB5{uuHmuUb2IS0jR?Lb@+utxJ?O0; zI^*fj7GY!k`}8U9X<57CeT-pN#9>-Q1&&C+S=bcvzsDQ^WDUJw`qA+FfWIw5KiX zIo@#Di4N-xRxfkCQ*F_HgCFzyEet_$jeiRzu<(W=ievgo65^l*PWh$0zQfV@_QgGI zW@dsTfiQcP3I=zg`VuuU)h@2sY$>k$&G)YA?*uBvC=+CdZWiMSV==1C2beS-@j6jZ zmKPO?P>Lv-O%-N|2}#dy4Y2C}iu^#{)OGy&XhO`dA9|FSPd!;Kxm&Rl2{|!Gl|2 z)q_9c_0N;fm6fjd^C;934`u8{_ExUWNw{4(y^FfQBDPg03*7LtUG|~*jA@GsBRc7B z_I?Xi)PzQFC{6{hyI|1}MVjI&K^WNBW9s`#ts=76lewz}o~o2WmNbP7+W)qa7f3+8 zCs(z@b<^Q`?v-daJBNf@6h zX^bLY{BB^rYnhlcfbYQHGdt*RNvFg5EW40k{K4im4JuejJK1zx+IInIscI!r<Af=;5-+w}IDrrHG2AYn z0FCX}L5Ji(FVLdhe;-U{(O&Bk=;+S*Sr2U2al7V`joK~<0USUM0DRUnG5|%DM`0o< z6GcIrYwX&u3p>6(q!#v$3MjPimN}K^k$|gQYPe3NTO~?=V=s#Tv~pio3~r{xWv!n5 zsp++&3H*%{YRKVWZe|9)nhFJXMszNHwi>QBxr*Q~AcS>QTg4$8*5u;}7z&Fenn=9W z<)cfB_0x;EyY&S1V$KV4rF5xSTL_z!OxacPiwAB^7hz`a-xuzeZ65kLRme5**;{)G_o7uoex7k zKAXKNsCe1y`5VN&CeqQ1?v18c`_V_!0o!)|3zeqhTgQ&yTM8&O8&r*CKdnAnz%7x@ zGqI@Y7*VO(mIf~Vtfzx1J6I?kSTA;mpZahIv|{Xf|7s$Uv|K!Gu7%{?THbPviU$O# z8Kq1+Ofnr{Z;@*6gLuEqHP_si8Ygx+{Q5*n!KkX;knbx!r?u)(b=+KkoUa2Mpp&u# z7sj?Un2ET}Kf29PFv)S#MH_sgEhFyhCKj-22Xgz7qgd&>*tR)+&an{r;~s(DR0U$M z6)JcTNngf`-|O^k2ij)T({;cm&C18GKAi2t*Gw+{JKC|h>#|LzkH}qovNGan_t3t1 zK^-`whQm#>6^!f^3uDtU+>&(BI$2`F=u+lAGQ=h%t0cgRCx(sbigj(XufFp;Pdpx= z_t?bzH!YHdbeunu&RH*bRig3uUjB?w9R+_kXPk)|4E9A=;8mV; zd^Sts(~Zi7*RpGOs`V1gk~V%HxpY&hf3d@-!FJTEzMC{L)ZpnoX#m zY4FKATmWW5!zqQ>M-`-G$$$a-7T(P7;cY}f5hH33)NAU=1vN^w+qk&?zU$&;M9>eg zVERPzxkn7zW9%9)QAyqcnq;U;<03!%lseK%Pv*(ExbXP-7o?YuH^9>#G4rXfBoG7n zZT9H0dB&{_!wPc(2!&xFF#+oy1H<9Y-zOlB0X!Yw{$Kmu+cJdf6)_N1!$`xl=Xy0* zUlDN|{or@VbCc~?=LGk{rUFXs7I)7aZExRTkLswXEg@7Dfj_~JmQWBc75nJ@KQy<| Az5oCK literal 0 HcmV?d00001 diff --git a/src/huplain.bst b/src/huplain.bst new file mode 100644 index 0000000..0c02e48 --- /dev/null +++ b/src/huplain.bst @@ -0,0 +1,1910 @@ +% +% huplain.bst -- plain.bst in Hungarian +% by pts@fazekas.hu at Thu Oct 30 10:10:04 CET 2003 +% tetex-url at Mon May 3 20:01:40 CEST 2004 +% derived from BibTeX standard bibliography style `plain' +% version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09. +% +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation; either version 2 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% !! title={Az foo} -> key={foo} +% !! auto add space into URLs longer than 70 characters +% !! don't remove double-accent in T1 encoding: \'{\`a}} +% !! sort year +% !! make sure about Hungarian typography of {proceedings} and {inproceedings} +% it is better now to have talked=1, (Elhangzott a ... cm konferencin) +% !! also remove space after \ae before calling purify$ +% !! crossrefs +% !! ` type ' +% !! hu ordering: author, year, title if author is present +% title, year if author is missing! +% !! use and document ``address'' +% !! MSZ 3401--81. A bibliogrfiai ttelek betrendbe sorolsnak szablyai. +% !! MSZ 3402--80. Knyvek bibliogrfiai adatkzlse s bels elrendezse. +% !! MSZ 3424/*-*. Bibliogrfiai lers. *. +% !! MSZ 3432-85. Szavak s szkapcsolatok rvidtse a bibliogrfiai lersban. +% !! MSZ 3440/*-*. A bibiliogrfiai lers besorolsi adatai. *. +% !! abbrv style for J.-P. Sartre +% !! test all entry types +% !! optional \uppercase or \textsc +% !! "5~ {\hbox{ja}}nu\'ar" #1 "({l,}{ff,})" format.name$ warning$ +% !! format.name$ keeps the first char of the name only, so specify {Gy}ula +% !! don't use width$ ??, because it's the cmr10 font in 1987. +% !! getting the first chars of names +% !! \include... +% !! bibgerman.sty, gerplain.bst, language = "german" | "USenglish" | "english" etc. +% \selectlanguage{...} \bibitem... +% !! doc: parametric volume: `ktet' (volumeisyearly={1}) instead of `vf.' +% OK: smaller space for \newblock +% OK: huname: name in hungarian order +% SUXX: cannot read current (overridden) MACRO values from .bst +% SUXX: #161 int.to.chr$ doesn't work (out of bounds), stupid BibTeX... +% Dat: @preamble { "..." # "..." } +% Dat: bibtex removes spaces from end of field contents +% Dat: `volume=' is `vfolyam' +% Dat: Doc: key={{ }.} +% Dat: Doc: write non-decaptilized titles: title = {Fejt {Ferenc} s a szocildemokrcia}, +% Dat: print debug messages with "foo" warning$ +% + +ENTRY + { address + author + booktitle + chapter + edition + editor + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + school + series + title + type + volume + year + + street + zip + city + phone + mobile + name + + numvolumes + numpages + tetex-url + ctan-url + url + isbn + issn + nocheck % ****pts**** + huname % ****pts**** + inputenc % ****pts**** + author2 % ****pts**** + talked % ****pts**** + volumeisyearly % ****pts**** + + % vvv for fmts + firstname.fmt % ****pts**** + lastname.fmt % ****pts**** + } + {} + { label adr.char } % !! what does this mean? + + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + + + +STRINGS { ss tt } + +%STRINGS { acc.latin2.160 acc.latin1.160 acc.160 } +%FUNCTION {init.accs} { +% " A L LS SSTZ-ZZ a l ls sstz zzRAAAALCCCEEEEIIDDNNOOOO*RUUUUYTsraaaalccceeeeiiddnnoooo/ruuuuytd" 'acc.latin2.160 := +% " ! | AAAAAAACEEEEIIIIDNOOOOO*OUUUUYTsaaaaaaaceeeeiiiidnooooo/ouuuuyty" 'acc.latin1.160 := +%} +%%** @param #1 string +%%** @return string +%FUNCTION {rmacc.latinx} { % ****pts**** +% 'tt := +% "" 'ss := +% { tt empty$ not } { +% #1 +% { duplicate$ tt swap$ #1 substring$ +% duplicate$ "" = { pop$ #0 } { chr.to.int$ #160 < } if$ +% } { #1 + } while$ +% duplicate$ tt swap$ #1 swap$ #1 - substring$ +% % duplicate$ ";" * warning$ +% ss swap$ * 'ss := +% duplicate$ tt swap$ #1 substring$ +% duplicate$ "" = { pop$ } { +% chr.to.int$ #159 - acc.160 swap$ #1 substring$ +% ss swap$ * 'ss := +% #1 + +% } if$ +% tt swap$ global.max$ substring$ 'tt := +% % tt warning$ +% } while$ +% ss +%} +% +%%** @param #1 a string +%%** @return a string +%FUNCTION {rmacc} { % **** pts **** +% inputenc empty$ 'skip$ { +% inputenc "latin1" = { acc.latin1.160 'acc.160 := rmacc.latinx } 'skip$ if$ +% inputenc "latin2" = { acc.latin2.160 'acc.160 := rmacc.latinx } 'skip$ if$ +% } if$ +%} + +STRINGS { acc4.latin2.160 acc4.latin1.160 acc4.160 } +FUNCTION {init.accs4} { + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%\S %\" quote$ "{}%%%%%%%%%%%%%%%%%%%%%%%%\={}%%%%%%%%%%%%%%%%\'{}%%%%\P %%%%%\c\ %%%%%%%%%%%%%%%%%%%%%%%%%%%%\`A%\'A%\^A%\~A%\" quote$ "A%\r A\AE%\c C\`E%\'E%\^E%\" quote$ "E%\`I%\'I%\^I%\" quote$ "I%\DH%\~N%\`O%\'O%\^O%\~O%\" quote$ "O%%%%%\O %\`U%\'U%\^U%\" quote$ "U%\'Y%\TH%\ss%\`a%\'a%\^a%\~a%\" quote$ "a%\r a\ae%\c c\`e%\'e%\^e%\" quote$ "e%\`\i\'\i\^\i\" quote$ "\i\dh%\~n%\`o%\'o%\^o%\~o%\" quote$ "o%%%%%\o %\`u%\'u%\^u%\" quote$ "u%\'y%\th%\" quote$ "y%" * * * * * * * * * * * * * * * * * * * * * * * * 'acc4.latin1.160 := + "%%%%\k A\u{}\L %%%%%\v L\'S%\S %\" quote$ "{}\v S\c S\v T\'Z%%%%%\v Z\.Z%%%%%\k a\k\ \l %\'{}\v l\'s%\v{}\c\ \v s\c s\v t\'z%\H{}\v z\.z%\'R%\'A%\^A%\u A\" quote$ "A%\'L%\'C%\c C\v C\'E%\k E\" quote$ "E%\v E\'I%\^I%\v D\DJ%\'N%\v N\'O%\^O%\H O\" quote$ "O%%%%%\v R\r U\'U%\H U\" quote$ "U%\'Y%\c T\ss%\'r%\'a%\^a%\u a\" quote$ "a%\'l%\'c%\c c\v c\'e%\k e\" quote$ "e%\v e\'\i\^\i\v d\dj%\'n%\v n\'o%\^o%\H o\" quote$ "o%%%%%\v r\r u\'u%\H u\" quote$ "u%\'y%\c t\.{}" * * * * * * * * * * * * * * * * * * 'acc4.latin2.160 := +} +%** @param #1 string +%** @return string +FUNCTION {rmacc4.latinx} { % ****pts**** + 'tt := + "" 'ss := + { tt "" = not } { % Dat: empty$ is true for space + #1 + { duplicate$ tt swap$ #1 substring$ + duplicate$ "" = { pop$ #0 } { chr.to.int$ #160 < } if$ + } { #1 + } while$ + duplicate$ tt swap$ #1 swap$ #1 - substring$ + % duplicate$ ";" * warning$ + ss swap$ * 'ss := + duplicate$ tt swap$ #1 substring$ + duplicate$ "" = { pop$ } { + % chr.to.int$ #159 - acc.160 swap$ #1 substring$ + duplicate$ chr.to.int$ + acc4.160 swap$ duplicate$ + duplicate$ + #639 - #4 substring$ + duplicate$ "%%%%" = { + pop$ + } { + swap$ pop$ + duplicate$ #4 #1 substring$ "%" = { #1 #3 substring$ } 'skip$ if$ + "{" swap$ * "}" * + } if$ + ss swap$ * 'ss := + #1 + + } if$ + tt swap$ global.max$ substring$ 'tt := + % tt warning$ + } while$ + ss +} + +%** Changes "" to "{\'a}" etc. +%** @param #1 a string +%** @return a string +FUNCTION {rmacc4} { % **** pts **** + inputenc empty$ 'skip$ { + inputenc "latin1" = { acc4.latin1.160 'acc4.160 := rmacc4.latinx } 'skip$ if$ + inputenc "latin2" = { acc4.latin2.160 'acc4.160 := rmacc4.latinx } 'skip$ if$ + } if$ +} + +INTEGERS { acc.fwd } +%** Changes "fo{\'o}h{\H u}s" to "fo\'oh\H us". Helps keeping ligatures. +%** Changes `{\ae}' to `\ae ' and `{\\XY}' to `\XY ' +%** Changes only known accents inside braces, followed by 1 or 2 accented +%** letters. +%** Dat: previous \oe must be inserted as {\\oe}, the same for {\DH} etc. +%** @param #1 string +%** @return string +FUNCTION {rmbrace.accs} { % ****pts**** + % Dat: LaTeX non-alphanumeric accents \`\'\^\~\"\=\. + % Dat: LaTeX accents for purify$: \c\u\v\H\d\b\t\r + % Dat: specially removed: {\?...} -> ... + 'tt := + "" 'ss := + { tt "" = not } { + #1 + { duplicate$ tt swap$ #2 substring$ + duplicate$ "" = { pop$ #0 } { "{\" = not } if$ + } { #1 + } while$ + duplicate$ tt swap$ #1 swap$ #1 - substring$ + % duplicate$ ";" * warning$ + ss swap$ * 'ss := + + duplicate$ tt swap$ #2 + #1 substring$ + "}" = { #3 } { + duplicate$ tt swap$ #3 + #1 substring$ + "}" = { % `{\i}' etc. + duplicate$ tt swap$ #2 + #1 substring$ + duplicate$ "o" = {#4} { + duplicate$ "O" = {#4} { + duplicate$ "l" = {#4} { + duplicate$ "L" = {#4} { + duplicate$ "i" = {#4} { + duplicate$ "j" = {#4} { + #3} % Dat: disallow other {\X} + if$} if$} if$} if$} if$} if$ + swap$ pop$ + } { + duplicate$ tt swap$ #4 + #1 substring$ + "}" = { #5 } { + duplicate$ tt swap$ #5 + #1 substring$ + "}" = { #6 } { #3 } if$ + } if$ + } if$ + } if$ + 'acc.fwd := + % Status: offset-of-"\{" + %%acc.fwd int.to.str$ warning$ + acc.fwd #3 = { + duplicate$ tt swap$ acc.fwd substring$ % copy 3 bytes + } { + duplicate$ #1 + tt swap$ acc.fwd #2 - substring$ % keep "\'o" or "\H u" only + %%duplicate$ warning$ + duplicate$ "\oe" = {#5} { + duplicate$ "\OE" = {#5} { + duplicate$ "\ae" = {#5} { + duplicate$ "\AE" = {#5} { + duplicate$ "\aa" = {#5} { + duplicate$ "\AA" = {#5} { + duplicate$ "\th" = {#5} { + duplicate$ "\TH" = {#5} { + duplicate$ "\dh" = {#5} { + duplicate$ "\DH" = {#5} { + duplicate$ "\dj" = {#5} { + duplicate$ "\DJ" = {#5} { + duplicate$ "\ng" = {#5} { + duplicate$ "\NG" = {#5} { + duplicate$ "\ss" = {#5} { + duplicate$ "\SS" = {#5} { + duplicate$ "\o" = {#5} { + duplicate$ "\O" = {#5} { + duplicate$ "\l" = {#5} { + duplicate$ "\L" = {#5} { + duplicate$ "\i" = {#5} { + duplicate$ "\j" = {#5} { + duplicate$ #2 #1 substring$ + duplicate$ "`" = {#1} { + duplicate$ "'" = {#1} { + duplicate$ "^" = {#1} { + duplicate$ "~" = {#1} { + duplicate$ quote$ = {#1} { + duplicate$ "=" = {#1} { + duplicate$ "." = {#1} { + duplicate$ "c" = {#2} { + duplicate$ "u" = {#2} { + duplicate$ "v" = {#2} { + duplicate$ "H" = {#2} { + duplicate$ "d" = {#2} { + duplicate$ "b" = {#2} { + duplicate$ "t" = {#2} { + duplicate$ "r" = {#2} { + duplicate$ "?" = {#3} { + duplicate$ "\" = {#4} { % added at Mon May 17 15:39:30 CEST 2004 + #0} if$} if$} if$} if$} if$} if$} if$} if$} if$} + if$} if$} if$} if$} if$} if$} if$} if$ + % Stack: "\'o" "'" 0|1|2 + swap$ pop$ + } if$} if$} if$} if$} if$} if$} if$} if$} if$} if$} if$} if$} if$} if$} + if$} if$} if$} if$} if$} if$} if$} if$ + + % Stack: "\'o" 0|1|2|3 + duplicate$ #5 = { + pop$ " " * % `{\oe}' becomes `\oe ' + } { duplicate$ #4 = { + pop$ #2 global.max$ substring$ % include single backlsash + " " * % add space so `{\\th}' becomes `\th ' + } { duplicate$ #3 = { + pop$ #3 global.max$ substring$ + } { duplicate$ #2 = { + pop$ + duplicate$ #3 #1 substring$ + " " = + } 'skip$ if$ + % Stack: "\'o" 0|1 + 'skip$ { "{" swap$ * "}" * } if$ + } if$ } if$ } if$ + } if$ + ss swap$ * 'ss := + acc.fwd + tt swap$ global.max$ substring$ 'tt := + } while$ + ss +} + +% --- + +INTEGERS { output.state before.all mid.sentence after.sentence after.block + cur.adr.char after.authors } +STRINGS { s t ls rs } + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := + #4 'after.authors := +} + + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\bibNewBlock " write$ + } + { output.state before.all = + 'write$ + { output.state after.authors = + { write$ newline$ "\bibNewBlock " write$ } + { add.period$ " " * write$ } + if$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ + nocheck empty$ { "empty " t * " in " * cite$ * warning$ } {} if$ + } + 'output.nonnull + if$ +} + +% @return a string +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + inputenc empty$ {} { " \bibInputEncoding{" inputenc "}" * * write$ } if$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ + inputenc empty$ 'skip$ { "\bibResetInputEncoding" write$ newline$ } if$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +% ****pts**** +FUNCTION {new.block.authors} { + duplicate$ empty$ 'skip$ { ":" * } if$ + output.state before.all = + 'skip$ + { after.authors 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "{\em " swap$ * "}" * } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.isbn} +{ isbn empty$ + { "" } + { new.block "ISBN " isbn * } + if$ +} + +FUNCTION {format.issn} +{ issn empty$ + { "" } + { new.block "ISSN " issn * } + if$ +} + +%** is.url.split.char <0-or-1> +%** Is the spefified char candidate to split the URL at? +FUNCTION {is.url.split.char} { + duplicate$ "/" = { pop$ #1 } { + duplicate$ "." = { pop$ #1 } { + duplicate$ "?" = { pop$ #1 } { + duplicate$ "&" = { pop$ #1 } { + duplicate$ "-" = { pop$ #1 } { + pop$ #0 } if$ } if$ } if$ } if$ } if$ +} + +%** string.length +%** Imp: a faster implementation +%** Dat: destroys 'ls +FUNCTION {string.length} { + 'ls := + #1 + { duplicate$ ls swap$ #1 substring$ "" = #1 swap$ - } + { #1 + } while$ + #1 - + "" 'ls := +} + + +INTEGERS { last.split.ofs } + +%** split.url +%** We have to add spaces (works with \usepackage{url}), because otherwise +%** bibtex adds a % at column 79. +%** After a maxinmum of 71 chars, a space gets inserted. +%** Clobbers 'ss, 'ls and 'rs. +FUNCTION {split.url} { + % We add spaces after the last is.url.split.char + 'ss := % save original string + #0 'last.split.ofs := % Dat: last offset to split _after_ + "" 'rs := + #1 % loop variable + { duplicate$ ss swap$ #1 substring$ "" = #1 swap$ - } % more chars in ss + { duplicate$ ss swap$ #1 substring$ is.url.split.char { + duplicate$ 'last.split.ofs := + } 'skip$ if$ + duplicate$ #70 > { + last.split.ofs #0 = { + duplicate$ 'last.split.ofs := % Dat: split at any char if cannot split at good position + } 'skip$ if$ + rs ss #1 last.split.ofs substring$ " " * * 'rs := + ss last.split.ofs #1 + ss string.length substring$ 'ss := + %% ss warning$ + last.split.ofs - #1 + % decrement loop variable + %% duplicate$ warning$ + #0 'last.split.ofs := + } { #1 + } if$ + } while$ + pop$ % Dat: pop loop variable + rs ss * + "" 'ss := + "" 'rs := +} + +FUNCTION {output.url} { + url empty$ + { "" } + { new.block "" output.nonnull + before.all 'output.state := + newline$ % Dat: bibtex breaks lines -- let it be longer + "\bibUrll{URL} >" url split.url * ">" * } + if$ output + ctan-url empty$ + { "" } + { new.block "" output.nonnull + before.all 'output.state := + newline$ % Dat: bibtex breaks lines -- let it be longer + "\bibUrll{CTAN} >" ctan-url split.url * ">" * } + if$ output + tetex-url empty$ + { "" } + { new.block "" output.nonnull + before.all 'output.state := + newline$ % Dat: bibtex breaks lines -- let it be longer + "\bibUrll{te\TeX} >" tetex-url * split.url ">" * } + if$ output +} + +% ****pts**** +STRINGS { nfmt0 nfmt1 nfmt2 nfmt3 } +STRINGS {firstname.fmt0 lastname.fmt0} +FUNCTION {init.nfmt0} { + "ff" 'firstname.fmt0 := + "ll" 'lastname.fmt0 := + % "f." 'firstname.fmt0 := % similar to abbrev.bst +} +FUNCTION {init.nfmts} { + "{" firstname.fmt0 "~}{vv~}{" lastname.fmt0 "}{, jj}" * * * * 'nfmt0 :=% 0: English order + "{jj~}{vv~}{" lastname.fmt0 "}{~" firstname.fmt0 "}" * * * * 'nfmt1 := % 1: Hungarian name in Hungarian bib + "{vv~}{" lastname.fmt0 "}{, " firstname.fmt0 "}{, jj}" * * * * 'nfmt2 := % 2: English name in Hungarian bib + "{jj~}{vv~}{ll}{~f.}" 'nfmt3 := % 3: Hungarian name in Hungarian bib, abbreviated name +} + +FUNCTION {format.names} +{ rmacc4 's := % ****pts**** + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } { + % ****pts**** + huname empty$ { s nameptr nfmt0 format.name$ 't := }{ % empty: English order + huname "0" = { s nameptr nfmt0 format.name$ 't := }{ % 0: English order + huname "1" = { s nameptr nfmt1 format.name$ 't := }{ % 1: Hungarian name in Hungarian bib + huname "2" = { s nameptr nfmt2 format.name$ 't := } % 2: English name in Hungarian bib + { s nameptr nfmt3 format.name$ 't := } % 3: Hungarian name in Hungarian bib, abbreviated name + if$ }if$ }if$ }if$ + % ^^^ Dat: important to have no space in {ll} for "others" + t rmbrace.accs 't := % ****pts**** + nameptr #1 > + { namesleft #1 > + { "\bibAnd 0" * t * } + { % numnames #2 > { "," * } 'skip$ if$ % ****pts**** + %% t ";;" * warning$ + t "others" = + { "\bibEtAl ." * } + { numnames #2 > { "\bibAnd 2" } { "\bibAnd 1"} if$ * t * } + if$ + } + if$ + } + 't + if$ + %% t warning$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.names } + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > { "\bibEd 1" } { "\bibEd 0" } if$ * %****pts**** + } + if$ +} + +FUNCTION {format.title} +{ title empty$ + { "" } + { title rmacc4 "t" change.case$ rmbrace.accs } % Dat: ****pts**** get used to it in English... + if$ +} + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +% Dat: possible months formats in .bib: +% month = jun # "-" # aug, --> "j\'unius--\allowbreak augusztus" !! +% month = jun, --> "j\'unius" +% month = "8~" # feb, --> "februr 8." +% month = nov # ", " # dec, --> "november\nobreak\hskip--\allowbreak december" + +FUNCTION {format.date} +{ year empty$ + { month empty$ + { "" } + { "there's a month but no year in " cite$ * warning$ + month + } + if$ + } + { month empty$ + 'year + { year ".\ " * + month #1 "{ll}{~ff.}" format.name$ % convert "december" -> "december"; "5~december" -> "december~5." + % ^^^ !! convert "janu\'ar--febru\'ar" and "janu\'ar, febru\'ar" to "j--f"... + % ^^^ !! convert . to \hbox{.} at end, to have frenchspacing... + * } % !! date + if$ + } + if$ +} + +FUNCTION {format.btitle} +{ title rmbrace.accs emphasize +} + +%** tie.or.space.connect "" +%** is ~ if is long (>=3 normal letters) +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +FUNCTION {numpages.output} { % ****pts**** + numpages empty$ 'skip$ { + numpages "p." tie.or.space.connect output + } if$ +} + +FUNCTION {note.output} { % ****pts**** + note empty$ 'skip$ { note rmbrace.accs output.nonnull } if$ +} + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {format.series} { % ****pts**** + series empty$ { "" } { + series + type$ "inproceedings" = type$ "proceedings" = or + { " kon\-fe\-ren\-cia\-so\-ro\-zat" } { " sorozat" } if$ + * + } if$ +} + +% Dat: INCOLLECTION: number = 23, series = "Fast Computers", +FUNCTION {format.bvolume} { % ****pts**** + volume empty$ number empty$ and { + series empty$ 'skip$ { format.series output new.block } if$ + % ^^^ Dat: don't emphasize {Osiris kziknyvek sorozat}, because it's after the book title. + numvolumes empty$ { "" } + { "\bibNumVolumes {" numvolumes "}." * * } if$ % ****pts**** + } { + "numvolumes and volume/number" numvolumes either.or.check + series empty$ 'skip$ { format.series output } if$ % Dat: no new.block + number empty$ + { volume } + { "volume and number" volume either.or.check number } if$ + n.dashify + duplicate$ #-1 #1 substring$ "-" = 'skip$ 'add.period$ if$ + "\bibVolume {" swap$ * "}." * + } if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { edition rmacc4 "l" change.case$ } + { edition rmacc4 "t" change.case$ } + if$ + add.period$ + " kiad." * % Dat: " kiad.": Gyurgyk Jnos: Szerkesztk s szerzk kziknyve, 533. oldal, 2. sor. + } + if$ +} + +% Dat: `FUNCTION {multi.page.check}' not needed + +%** Used by type$ {inbook} and {incollection} +%** English typography has: +%** pages 23--45 (pages={23--45}) +%** pp. 23--45. (pages={23--45}) +%** p. 23. (pages=={23}: on page 23) +%** p. 234 (numpages=234: the book has 234 pages) +%** Hungarian typography has: +%** 234 p. (numpages=234) +%** 23--45. p (pages={23--45}) +%** 23. p. (pages=23) +FUNCTION {format.pages} { % ****pts**** + pages empty$ + { "" } + { pages add.period$ n.dashify "p." tie.or.space.connect } + if$ +} + +FUNCTION {volume.caption} { % ****pts**** + volumeisyearly empty$ { "1" } { volumeisyearly } if$ % default is "1" + "0" = { "k\" quote$ "otet" * * } { "\'evf." } if$ +} + +FUNCTION {format.vol.num.pages} { % ****pts**** + volume duplicate$ empty$ { pop$ "" } { + add.period$ + volume.caption % "\'evf." + tie.or.space.connect } if$ + year empty$ { + nocheck empty$ { "empty year in " cite$ * warning$ } 'skip$ if$ + } { + duplicate$ empty$ + { pop$ format.date add.period$ } + { " (" * format.date * ")" * } if$ + } if$ + number empty$ 'skip$ { + duplicate$ empty$ 'skip$ { " " * } if$ + volume empty$ nocheck empty$ and { "there's a number but no volume in " cite$ * warning$ } 'skip$ if$ + number add.period$ "sz." tie.or.space.connect * + } if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + { "" } % 'format.pages + { chapter + type empty$ { "fejezet" } { + type "subsection" = { "alszakasz" } { + type "subsubsection" = { "alalszakasz" } { + type "chapter" = { "fejezet" } { + type "section" = { "szakasz" } { + type "part" = { "r{\'e}sz" } { + type "appendix" = { "f{\" quote$ "u}ggel{\'e}k" * * } { + type rmacc4 "l" change.case$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ + tie.or.space.connect + % Dat: no format.pages here % ****pts**** + } + if$ +} + +FUNCTION {format.in.edited} { % ****pts**** + editor "self" = % ****pts**** + { "\bibInSelf0" } + { "In " format.editors * ": " * } if$ + booktitle rmbrace.accs emphasize * +} + +FUNCTION {format.in.ed.booktitle} { + booktitle empty$ + { "" } + { editor empty$ + % vvv "In ": Gyurgyk Jnos: Szerkesztk s szerzk kziknyve, 130. oldal, 12. sor. + { "In " booktitle rmbrace.accs emphasize * } + 'format.in.edited if$ + } if$ +} + +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + + +%* @param #1 a string beginning with a possibly accented letter +%* @return "" or "z", corresponding to the Hungarian definite article "a" and "az" +FUNCTION {article.az} { + rmacc4 % remove accents smartly + purify$ + "l" change.case$ + #1 #1 substring$ + duplicate$ " " = {"z"} { % hack + duplicate$ "a" = {"z"} { + duplicate$ "e" = {"z"} { + duplicate$ "i" = {"z"} { + duplicate$ "o" = {"z"} { + duplicate$ "u" = {"z"} { + ""} if$ }if$ }if$ }if$ }if$ }if$ + swap$ pop$ +} + +%** by pts@fazekas.hu at Thu Nov 9 17:03:00 CET 2006 +%** @example "foo}" split.last.brace "foo" "}" +%** @example "food" split.last.brace "food" "" +FUNCTION {split.last.brace} { + duplicate$ #-1 #1 substring$ "}" = + { duplicate$ string.length #1 - #1 swap$ substring$ "}" } + { "" } if$ +} + +%** by pts@fazekas.hu at Thu Nov 9 17:03:00 CET 2006 +%** Clobbers 'rs and 'ls +%** @example "foobar" "bar" replace.at.end "foo" 1 +%** @example "foobar!" "bar" replace.at.end "foobar!" 0 +FUNCTION {remove.at.end} { + 'rs := % save pattern string % Dat: string.length destroys 'ls + duplicate$ rs string.length #-1 swap$ + substring$ rs = + { duplicate$ string.length rs string.length - #1 swap$ substring$ #1 } + { #0 } if$ +} + +FUNCTION {format.in.talked.booktitle} { + booktitle empty$ + { "" } + { editor empty$ + { + booktitle duplicate$ 's := + "A " swap$ #2 swap$ chop.word + "Az " swap$ #3 swap$ chop.word + %% duplicate$ warning$ + s = { + "a" booktitle article.az * + booktitle rmbrace.accs emphasize + tie.or.space.connect + } { booktitle rmbrace.accs emphasize } if$ + % Dat: now: "a~{\em Foo Konferencia}" + split.last.brace + swap$ + % Dat: now "}" "a~{\em Foo Konferencia" + % vvv Imp: maybe we don't need \- here, because it + % prevents hyphenation in earlier parts of the word + "Conference" remove.at.end { "Con\-fe\-ren\-ce-en" * swap$ * } { + "conference" remove.at.end { "con\-fe\-ren\-ce-en" * swap$ * } { + "Konferencia" remove.at.end { "Kon\-fe\-ren\-ci\'an" * swap$ * } { + "konferencia" remove.at.end { "kon\-fe\-ren\-ci\'an" * swap$ * } { + swap$ * " c{\'i}m{\H u} konferenci{\'a}n" * + } if$ } if$ } if$ } if$ + %% duplicate$ warning$ + % Dat: now "a~{\em Foo Konferencin}" + % or "a~{\em Foo} cm konferencin" + %% "alma" string.length warning$ + "Elhangzott " swap$ * + } 'format.in.edited if$ + } if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + key empty$ not and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +%** @param #1 default value for `type' +FUNCTION {format.thesis.type} { % ****pts**** + type empty$ 'skip$ { pop$ type } if$ + rmacc4 "t" change.case$ rmbrace.accs +} + +FUNCTION {format.tr.number} % ****pts**** +{ type empty$ + { "{\bibTechRep 0}" } % Dat: `{'..`}' to avoid "t" change.case$ + 'type + if$ + number empty$ + { rmacc4 "t" change.case$ } + { number add.period$ swap$ tie.or.space.connect } + if$ +} + +FUNCTION {format.article.crossref} +{ key empty$ + { journal empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * + warning$ + "" + } + { "In {\em " journal * "\/}" * } + if$ + } + { "In " key * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.crossref.editor} +{ editor #1 "{vv~}{ll}" format.name$ + editor num.names$ duplicate$ + #2 > + { pop$ " \bibEtAl ." * } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " \bibEtAl ." * } + { " \'es " * editor #2 "{vv~}{ll}" format.name$ * } % !! + if$ + } + if$ + } + if$ +} + +FUNCTION {format.book.crossref} +{ volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + "In " + } + { "Volume" volume tie.or.space.connect + " of " * + } + if$ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" * + } + { "{\em " * series * "\/}" * } + if$ + } + { key * } + if$ + } + { format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.incoll.inproc.crossref} +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { booktitle empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { "In {\em " booktitle * "\/}" * } + if$ + } + { "In " key * } + if$ + } + { "In " format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {article} %*type* ****pts**** +{ output.bibitem + format.authors "author" output.check + new.block.authors + format.title "title" output.check + new.block + crossref missing$ + { journal emphasize "journal" output.check + format.vol.num.pages output % format.date is inside this + } + { format.article.crossref output.nonnull + } if$ + format.pages output + format.issn output + output.url + new.block numpages.output note.output + fin.entry +} + +% copied from KOMA-Script +% by pts at Thu Oct 30 09:56:33 CET 2003 + +% !! how does it work and why? +FUNCTION {print.adrchr} +{ adr.char empty$ 'skip$ { % ****pts**** Dat: default + adr.char chr.to.int$ cur.adr.char > + { newline$ "\adrchar{" adr.char "}" * * write$ newline$ + adr.char chr.to.int$ 'cur.adr.char := + } + 'skip$ + if$ + } if$ % !! +} + +FUNCTION {get.names} +{ name empty$ + { organization empty$ + { "{}{}" } + { organization "{}" * } + if$ + } + { "{" name #1 "{ll}" format.name$ "}" * * + "{" name #1 "{ff}{ vv}" format.name$ "}" * * * + } + if$ +} + +%** Dat: deliberately with `sss', to avoid conflict +FUNCTION {addresss} { %*type* + % !! many improvements + output.bibitem pop$ + print.adrchr % !! + "\adrentry" write$ + get.names write$ newline$ + "{" + street empty$ + { "" } + { street " \\ " *} + if$ + * + zip empty$ + { "" } + { zip } + if$ + " " * * + city empty$ + { "" } + { city } + if$ + "}{" * * + phone empty$ + { + mobile empty$ + { "" } + { mobile } + if$ + }{ + mobile empty$ + { phone } + { phone "\\" mobile * * } + if$ + } + if$ + "}{}{}{}{" * * + key empty$ + { "" } + { key } + if$ + "}" * * write$ newline$ +} + + +% --- + +%** Used by type$ {book}, {inbook} and {incollection} +FUNCTION {books.tail} { % ****pts**** + crossref missing$ { + format.bvolume output % includes functionality of format.number.series + new.block % no comma in `1--4. kt., 7. kiad.' + } 'skip$ if$ + type$ "book" = { + chapter empty$ 'skip$ + { "can't use chapter for @book; try @inbook or @incollection" warning$ } if$ + } { + format.chapter.pages + pages empty$ { "chapter and pages" output.check } {output} if$ + new.block % new.sentence? -- for incollection + } if$ + author2 empty$ 'skip$ { author2 output.nonnull new.block } if$ + format.edition output new.block + crossref missing$ { + % format.bvolume output + % new.block + % format.number.series output % ****pts**** + % new.sentence + address output + format.date "year" output.check + publisher "publisher" output.check + } { + format.date "year" output.check + new.block + format.book.crossref output.nonnull + } if$ + format.pages output + format.isbn output + format.issn output % Dat: most books don't have this + output.url + new.block numpages.output note.output fin.entry +} + +FUNCTION {book} { %*type* + output.bibitem + author empty$ + { editor empty$ key missing$ { "" } { key } if$ "." = and + 'skip$ + { format.editors "author and editor" output.check } if$ + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block.authors + format.btitle "title" output.check + new.block + books.tail +} + +FUNCTION {booklet} { %*type* ****pts**** + output.bibitem + format.authors output + new.block.authors + format.title "title" output.check + new.block + format.bvolume output new.block + author2 output.nonnull new.block + format.edition output new.block + % howpublished address new.block.checkb + howpublished output + address output + % Dat: no publisher= + format.date output + format.isbn output + format.issn output % Dat: most books don't have this + output.url + new.block numpages.output note.output fin.entry +} + +FUNCTION {inbook} %*type* +{ book % ****pts**** +} + +FUNCTION {incollection} %*type* +{ output.bibitem + format.authors "author" output.check + new.block.authors + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check new.block } + { format.incoll.inproc.crossref output.nonnull } if$ + books.tail +} + +%** @param #1 thesis type +FUNCTION {thesises.tail} { % ****pts**** + format.thesis.type output.nonnull + school empty$ { nocheck empty$ { "empty school in " * cite$ * warning$ } 'skip$ if$ } 'skip$ if$ + school empty$ address empty$ and 'skip$ { + write$ before.all 'output.state := " (" + % school output address ")" * output + school ")" * output + new.block + } if$ + author2 empty$ 'skip$ { author2 output new.block } if$ + new.block + address output + format.date "year" output.check + output.url + new.block numpages.output note.output fin.entry +} + +%** Emits a decapitalized title. +FUNCTION {mastersthesis} { %*type* + output.bibitem + format.authors "author" output.check + new.block.authors + format.title "title" output.check + new.block + "{Diplomaterv}" % "{Doktori} {{\'e}rtekez{\'e}s} " % "Master's thesis" + thesises.tail +} + +%** Emits an \emph-asized title. +FUNCTION {phdthesis} { %*type* + output.bibitem + format.authors "author" output.check + new.block.authors + format.btitle "title" output.check + new.block + "{PhD} {\'e}rtekez{\'e}s " % "PhD thesis" + thesises.tail +} + +FUNCTION {misc} %*type* % ****pts**** +{ output.bibitem + format.authors output + title empty$ howpublished empty$ and 'skip$ { + new.block.authors % Dat: emits ":" + % title howpublished new.block.checkb % Dat: emits "." + format.title output + howpublished new.block.checka + howpublished output + } if$ + format.date output + format.isbn output + format.issn output % Dat: most books don't have this + output.url + new.block numpages.output note.output fin.entry + empty.misc.check +} + +FUNCTION {manual} %*type* ****pts**** +{ output.bibitem + author empty$ + { organization empty$ + 'skip$ + { organization output.nonnull } if$ + new.block + } + { format.authors output.nonnull new.block.authors } + if$ + format.btitle "title" output.check + author2 empty$ 'skip$ { author2 output new.block } if$ + format.edition output new.block + + publisher empty$ 'skip$ { "can't use publisher for @manual; try @book" warning$ } if$ + author empty$ + { address output } + { % organization address new.block.checkb + organization output + address output + } if$ + format.edition output + format.date output + publisher output + output.url + new.block numpages.output note.output fin.entry +} + + +FUNCTION {techreport} %*type* +{ output.bibitem + format.authors "author" output.check + new.block.authors + format.title "title" output.check + new.block + format.tr.number output.nonnull + author2 empty$ 'skip$ { author2 output new.block } if$ + address output + format.date "year" output.check + institution "institution" output.check + output.url + new.block numpages.output note.output fin.entry +} + +FUNCTION {unpublished} %*type* % ****pts**** +{ output.bibitem + format.authors "author" output.check + new.block.authors + format.title "title" output.check new.block + format.date output + output.url + new.block + note "note" output.check + fin.entry +} + +FUNCTION {inproceedings} %*type* +{ output.bibitem + format.authors "author" output.check + new.block.authors + format.title + talked empty$ 'skip$ 'emphasize if$ % at Thu Nov 9 16:19:53 CET 2006 + "title" output.check + new.block + crossref missing$ + { talked empty$ 'format.in.ed.booktitle 'format.in.talked.booktitle if$ + duplicate$ #1 #1 substring$ "I" = { % Dat: don't append to `Elhangzott' or empty booktitle + series empty$ { duplicate$ empty$ 'skip$ { " (kon\-fe\-ren\-cia\-anyag)" * } if$ } 'skip$ if$ + } 'skip$ if$ + "booktitle" output.check + format.bvolume output % includes functionality of format.number.series + author2 empty$ 'skip$ { author2 output.nonnull new.block } if$ + new.block + address output % ****pts**** + format.date "year" output.check + % new.sentence + organization output + publisher output + } + { format.incoll.inproc.crossref output.nonnull } + if$ + format.pages output + format.isbn output + format.issn output % Dat: most books don't have this + output.url + new.block numpages.output note.output fin.entry +} + +FUNCTION {proceedings} %*type* +{ output.bibitem + editor empty$ + { organization output } + { format.editors output.nonnull } + if$ + new.block + format.btitle "title" output.check + series empty$ { " (konferenciaanyag)" * } 'skip$ if$ + format.bvolume output % includes functionality of format.number.series + author2 empty$ 'skip$ { author2 output.nonnull new.block } if$ + address empty$ + { editor empty$ + { publisher new.sentence.checka } + { organization publisher new.sentence.checkb + organization output + } + if$ + publisher output + format.date "year" output.check + } + { address output.nonnull + format.date "year" output.check + % new.sentence % ****pts**** + editor empty$ + 'skip$ + { organization output } + if$ + publisher output + } + if$ + format.isbn output + format.issn output % Dat: most books don't have this + output.url + new.block numpages.output note.output fin.entry +} + +FUNCTION {conference} %*type* % ****pts**** +{ inproceedings } + +FUNCTION {default.type} { misc } + +FUNCTION {fmts} { %*type* % ****pts**** + % Emulation of \bibtem without typesetting anything. + newline$ + "\immediate\write\@auxout{\string\bibcite{" write$ + cite$ write$ + "}{0}}" write$ newline$ +} +FUNCTION {fmts2} { + firstname.fmt empty$ 'skip$ { firstname.fmt 'firstname.fmt0 := } if$ + lastname.fmt empty$ 'skip$ { lastname.fmt 'lastname.fmt0 := } if$ + init.nfmts +} + +%****pts**** +% Dat: {\-} is needed for format.name$ +MACRO {jan} {"ja{\-}nu{\-}\'ar"} +MACRO {feb} {"feb{\-}ru\'ar"} +MACRO {mar} {"m\'ar{\-}cius"} +MACRO {apr} {"\'ap{\-}ri{\-}lis"} +MACRO {may} {"m\'a{\-}jus"} +MACRO {jun} {"j\'u{\-}ni{\-}us"} +MACRO {jul} {"j\'u{\-}li{\-}us"} +MACRO {aug} {"au{\-}gusz{\-}tus"} +MACRO {sep} {"szep{\-}tem{\-}ber"} +MACRO {oct} {"ok{\-}t\'o{\-}ber"} +MACRO {nov} {"no{\-}vem{\-}ber"} +MACRO {dec} {"de{\-}cem{\-}ber"} + +% Dat: see also in mrabbrev.bib +MACRO {acmcs} {"ACM Computing Surveys"} +MACRO {acta} {"Acta Informatica"} +MACRO {cacm} {"Communications of the ACM"} +MACRO {ibmjrd} {"IBM Journal of Research and Development"} +MACRO {ibmsj} {"IBM Systems Journal"} +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} +MACRO {ieeetc} {"IEEE Transactions on Computers"} +MACRO {ieeetcad} {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} +MACRO {ipl} {"Information Processing Letters"} +MACRO {jacm} {"Journal of the ACM"} +MACRO {jcss} {"Journal of Computer and System Sciences"} +MACRO {scp} {"Science of Computer Programming"} +MACRO {sicomp} {"SIAM Journal on Computing"} +MACRO {tocs} {"ACM Transactions on Computer Systems"} +MACRO {tods} {"ACM Transactions on Database Systems"} +MACRO {tog} {"ACM Transactions on Graphics"} +MACRO {toms} {"ACM Transactions on Mathematical Software"} +MACRO {toois} {"ACM Transactions on Office Information Systems"} +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} +MACRO {tcs} {"Theoretical Computer Science"} + +READ + +%** @param #1 string +%FUNCTION {reverse} { % +% 't := "" 's := +% #1 +% { duplicate$ t swap$ #1 substring$ "" = not } { +% duplicate$ t swap$ #1 substring$ +% s * 's := +% #1 + +% } while$ +% pop$ s +%} + +%** by pts@fazekas.hu at Mon May 17 16:50:26 CEST 2004 +%** @param 1: TeX string +%** @return {\th}, {\TH} {\dh} {\DH} {\dj} {\DJ} {\ng} {\NG} {\SS} changed to +%** th TH dh DH dj DJ ng NG SS +FUNCTION {rmbrace.extrat1} { + % Dat: #4 #1 substring$ is substr($_,3,1) + 'ss := + "" 'tt := + #1 'len := + #5 + { duplicate$ ss swap$ #1 substring$ "" = not } { + % Stack: index-value (#5, #6 ...) + duplicate$ ss swap$ #1 substring$ "}" = { + duplicate$ ss swap$ #4 - #5 substring$ + %% duplicate$ warning$ + duplicate$ "{\th}" = {#1} { + duplicate$ "{\TH}" = {#1} { + duplicate$ "{\dh}" = {#1} { + duplicate$ "{\DH}" = {#1} { + duplicate$ "{\dj}" = {#1} { + duplicate$ "{\DJ}" = {#1} { + duplicate$ "{\ng}" = {#1} { + duplicate$ "{\NG}" = {#1} { + duplicate$ "{\SS}" = {#1} { + #0 }if$ }if$ }if$ }if$ }if$ }if$ }if$ }if$ }if$ + } {#42 #0} if$ + #1 = { + swap$ + % Stack: 5-char-substring index-value + duplicate$ tt swap$ ss swap$ len swap$ len - #4 - substring$ * 'tt := + swap$ tt swap$ #3 #2 substring$ * 'tt := + #1 + + duplicate$ 'len := + } { pop$ #1 + } if$ + } while$ + pop$ % index value + tt ss len global.max$ substring$ * +} + + +FUNCTION {sortify} +{ rmacc4 % remove accents smartly, so purify$ will remove the accent + % rmbrace.accs + duplicate$ % ****pts**** + rmbrace.extrat1 % ****pts**** + purify$ + % Dat: purify$ removes from "vrom", keeps `varom' in "v\'arom","v{\'a}rom" + % Dat: purify$ changes {\ss} to ss, but {\dj} to empty + "l" change.case$ + " " * + swap$ * +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 > + { " " * } + 'skip$ + if$ + s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := + nameptr numnames = t "others" = and + { "et al" * } + { t sortify % Dat: calls rmacc4 and purify$ + %% duplicate$ warning$ + * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ rmacc4 't := + "A " #2 + "An " #3 + "The " #4 + "Egy " #4 + "Der " #4 + "Die " #4 + "Das " #4 + "Un " #3 + "Une " #4 + "Az " #3 t chop.word + chop.word chop.word chop.word chop.word chop.word % ***pts**** + chop.word + chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ name empty$ + { author empty$ + { key empty$ + { "to sort, need author/key/name in " cite$ * warning$ + title empty$ { "" } { title sort.format.title } if$ % ****pts**** + }{ key sortify } + if$ + }{ author sort.format.names } + if$ + }{ name sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key missing$ + { title empty$ nocheck empty$ or + { "to sort, need author, editor, or key in " cite$ * warning$ } 'skip$ if$ + title empty$ { "" } { title sort.format.title } if$ % ****pts**** + } + { key "." = % ****pts**** + { " " title sort.format.title * } % duplicate$ warning$ + % ^^^ Dat: " " is here to put them in front of other books + { key sortify } if$ + } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} +{ type$ "book" = type$ "inbook" = or + 'author.editor.sort + { type$ "proceedings" = + 'editor.organization.sort + { type$ "manual" = + 'author.organization.sort + { type$ "fmts" = + { fmts2 "" } % ****pts**** + 'author.sort + if$ + } + if$ + } + if$ + } + if$ + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +EXECUTE {init.accs4} +EXECUTE {init.nfmt0} +EXECUTE {init.nfmts} + +ITERATE {presort} + +SORT + +STRINGS { longest.label } + +INTEGERS { number.label longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +FUNCTION {bibIE.a} { + "\makeatletter" write$ newline$ + "\global\def\bibIE@lowc{%" write$ newline$ + " \expandafter\ifx\csname inputencoding\endcsname\relax" write$ newline$ + " \def\NeedsTeXFormat##1]{}%" write$ newline$ + " \def\ProvidesPackage##1]{}%" write$ newline$ + " \def\DeclareOption##1##2{}%" write$ newline$ + " \def\ProcessOptions{\@ifstar\@gobble\@empty}%" write$ newline$ + " \input inputenc.sty" write$ newline$ + " \let\NeedsTeXFormat \@notprerr" write$ newline$ + " \let\ProvidesPackage\@notprerr" write$ newline$ + " \let\DeclareOption \@notprerr" write$ newline$ + " \let\ProcessOptions \@notprerr" write$ newline$ + " \fi" write$ newline$ + " \global\let\bibIE@lowc\relax}" write$ newline$ + "\def\bibIE@lowa#1#2{%" write$ newline$ + " \global\def\bibResetInputEncoding{\bibIE@lowb{ascii}}% anti-warning" write$ newline$ + " \ifx#1\relax\else" write$ newline$ + " \ifx#1\@inpenc@undefined@\@empty" write$ newline$ + " \global\def\bibResetInputEncoding{\bibIE@lowb{#2}}%" write$ newline$ + " \ifx\bibResetInputEncoding\reserved@a% keep old encoding" write$ newline$ + " \global\let\bibResetInputEncoding\@empty \let\reserved@a\@empty \fi" write$ newline$ + " \fi\fi}" write$ newline$ +} +FUNCTION {bibIE.b} { + "\let\bibIE@input\input" write$ newline$ + "\def\bibIE@ascii{ascii}" write$ newline$ + "\def\bibIE@lowb#1{%" write$ newline$ + " \def\reserved@a{#1}\ifx\reserved@a\bibIE@ascii" write$ newline$ + " \gdef\@inpenc@test{\global\let\@inpenc@test\relax}%" write$ newline$ + " \edef\@inpenc@undefined{\noexpand\@inpenc@undefined@{ascii}}%" write$ newline$ + " \@inpenc@loop\^^A\^^H\@inpenc@loop\^^K\^^K%" write$ newline$ + " \@inpenc@loop\^^N\^^_\@inpenc@loop\^^?\^^ff%" write$ newline$ + "\else\def\input{\global\let\@inpenc@test\relax \bibIE@input}% no {ascii} warn" write$ newline$ + " \inputencoding{#1}\fi}%" write$ newline$ + "\def\bibInputEncoding#1{%" write$ newline$ + " \bibIE@lowc" write$ newline$ + " \def\reserved@a{\bibIE@lowb{#1}}%" write$ newline$ + " % vvv \@inpenc@undefined -> `\@inpenc@undefined@{latin2}' or undefined" write$ newline$ + " \expandafter\expandafter\expandafter\bibIE@lowa\csname" write$ newline$ + " @inpenc@undefined\endcsname\relax" write$ newline$ + " \reserved@a}" write$ newline$ newline$ +} + +%** Usage: insert `\let\bibEarlyBegin\hfuzz \InputIfFileExists{\jobname.bbl}{}{}' +%** into the LaTeX document preamble to avoid running latex(1) twice after +%** bibtex(1) has been run. +FUNCTION {bibIE.c} { + "\makeatletter \ifx\bibEarlyBegin\hfuzz" write$ newline$ + " \def\bibEarlyBegin{\begingroup\everypar{}\sloppy\hbadness10000 " write$ newline$ + " \def\Hy@colorlink##1{\begingroup}" write$ newline$ % for hyperref.sty + " \def\Hy@endcolorlink{\endgroup}" write$ newline$ % for hyperref.sty + " \def\@inpenc@loop##1##2{}" write$ newline$ + " \def\thebibliography##1{}" write$ newline$ + " \def\endthebibliography{\skip@egroup\aftergroup\bibEarlyEnd}%" write$ newline$ + " \def\inputencoding##1{}\c@enumi\z@" write$ newline$ + " \def\bibitem{\skip@egroup \let\skip@egroup\egroup" write$ newline$ + " \advance\c@enumi\@ne\@ifnextchar[\@lbibitem\@bibitem}%" write$ newline$ + " \def\@lbibitem[##1]##2{\bibcite{##2}{##1}%" write$ newline$ + " \setbox0\vbox\bgroup}% avoid emitting boxes" write$ newline$ + " \def\@bibitem##1{\expandafter\skip@bibcite\expandafter" write$ newline$ + " {\the\c@enumi}{##1}\setbox0\vbox\bgroup}% avoid emitting boxes" write$ newline$ + " \def\skip@bibcite##1##2{\bibcite{##2}{##1}}%" write$ newline$ + " \catcode11=9 % ignored" write$ newline$ + " \@tempcnta 1 \loop\catcode\@tempcnta=9" write$ newline$ + " \ifnum\@tempcnta< 8 \advance\@tempcnta\@ne\repeat" write$ newline$ + " \@tempcnta 14 \loop\catcode\@tempcnta=9" write$ newline$ + " \ifnum\@tempcnta< 31 \advance\@tempcnta\@ne\repeat" write$ newline$ + " \@tempcnta127 \loop\catcode\@tempcnta=9" write$ newline$ + " \ifnum\@tempcnta<255 \advance\@tempcnta\@ne\repeat" write$ newline$ + " \let\skip@egroup\relax}" write$ newline$ + " \def\bibEarlyEnd{\endgroup \let\bibcite\@gobbletwo" write$ newline$ + " \global\let\bibEarlyRead\relax}" write$ newline$ + " \bibEarlyBegin" write$ newline$ + "\else \let\bibEarlyEnd\relax \fi" write$ newline$ + newline$ +} + +FUNCTION {begin.bib} +{ bibIE.c + % Dat: bibTeX breaks long lines (>78 chars), so we wouldn't emit such lines + "\begin{thebibliography}{" longest.label * "}" * write$ newline$ + preamble$ empty$ 'skip$ { preamble$ write$ newline$ } if$ + % ****pts**** Dat: put preamble$ after \begin{thebibliography} + "\frenchspacing" write$ newline$ % !! optional + bibIE.a + bibIE.b + "\def\leftflushbreak{\ifx\\\@centercr\penalty100 \else" write$ newline$ % Dat: \\ is \@centercr for \raggedright + " \unpenalty\unpenalty{\@tempdima\lastskip\unskip\nobreak" write$ newline$ + " \hskip\@tempdima plus1fil}\null\penalty100 \hskip0pt plus-1fil\relax\fi}" write$ newline$ + % "\def\leftflushbreak{\nobreak\hskip0pt plus1fil\null\penalty100 \hskip0pt plus-1fil\relax}" write$ newline$ + + % Ignoring newline + spaces in a \verb (usually called in \bibUrll). + % This doesn't apply for \usepackage{url} -- please use that to have + % line breaks in the URLs. + % Example .bbl excerpt (to be converted to \bibUrll{URL} >http://foobarbaz>.) + % \bibUrll{URL} >http:// + % foobar + % baz<, + "\begingroup\lccode\string`~=\string`\^^M" write$ newline$ + " \lowercase{\endgroup\def\verb@eol@error{\obeylines\def~{\bibVerbNoSp}}}" write$ newline$ + "\begingroup\lccode\string`~=\string`\ \relax" write$ newline$ + " \lowercase{\endgroup\def\bibVerbNoSp#1{\ifx#1~\expandafter\bibVerbNoSp" write$ newline$ + " \else\expandafter#1\fi}}" write$ newline$ + + "\expandafter\ifx\csname bibUrll\endcsname\relax" write$ newline$ + "\expandafter\ifx\csname url\endcsname\relax" write$ newline$ + " \def\bibUrll#1>{\leavevmode\leftflushbreak #1~\verb>}" write$ newline$ % Imp: line breaks etc., \PVerb + "\else\def\bibUrll#1>{\leavevmode\leftflushbreak#1~\begingroup" write$ newline$ + " \catcode\string`\%=12 \catcode\string`\#=12 \bibUrlll}" write$ newline$ + " \def\bibUrlll#1>{\url{#1}\endgroup}\fi" write$ newline$ + % ^^^ "\else\def\bibUrll#1>#2>{\leftflushbreak #1~\url{#2}}\fi" write$ newline$ + % ^^^ Imp: do these parens work? Includes field URL for Internet addresses (best used with with the url.sty package of Donald Arseneau) + "\fi" write$ newline$ + % vvv Dat: so user can specify `{\empty Maf}fia' and still have the `ffi' ligature -- undocumented. + % vvv Dat: doesn't work with hyperref.sty, and has marginal benefits -- commented out + % "\def\empty{\egroup\expandafter\@firstofone\expandafter{\iffalse}\fi}" write$ newline$ + "\def\bibHU@mix#1{\egroup#1}" write$ newline$ + %"\def\empty{\expandafter\bibHU@mix\expandafter{\iffalse}\fi}" write$ newline$ + %"\def\bibHU@mix#1{\egroup#1}" write$ newline$ + % vvv Dat: Hungarian typgrphy dictates 1/3 non-stretchable space, which + % might look ugly, because the space between f+l names stretches more. + "\def\bibAnd#1{\nobreak\,\nobreak\hbox{--}\,}" write$ newline$ + % "\def\bibAnd#1{\ifcase#1 , \or\space and \or, and \fi}" write$ newline$ + % "\def\bibAnd#1{\ifcase#1 , \else\space\'es \fi}" write$ newline$ + % "\def\bibEtAl#1{ et~al.}" write$ newline$ % Dat: or `et al.' (meaning: et alii) + "\def\bibEtAl#1{ \'es m\'asok}" write$ newline$ + % ^^^ Dat: botht \bibEtAl confirmed by Gyurgyk (p. 137) + "\def\bibEd#1{ (szerk.)}" write$ newline$ + % "\def\bibEd#1{ (szerk\ifcase#1 .\else eszt\H{o}k\fi)}" write$ newline$ % (szerk.) or (szerkesztk) + % "\let\bibNewBlock\newblock" write$ newline$ + "\def\bibNewBlock{\unskip\space}" write$ newline$ + % "\def\bibVolume#1{k\" quote$ "otet}" * * write$ newline$ + "\def\bibVolume#1#2{#1 k\" quote$ "ot.} \let\bibNumVolumes\bibVolume" * * write$ newline$ + % "\def\bibTechRep#1{Technical Report}" write$ newline$ + "\def\bibTechRep#1{Jelent\'{e}s}" write$ newline$ % Dat: `.' utn van => nagybet + "\def\bibInSelf#1{In u\H{o}: }" write$ newline$ + "\csname bibOverride\endcsname" write$ newline$ +} + + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + +% #****pts**** !! +FUNCTION {what} { + % "dr. Kpeczi, Bla and Jules Verne and Kossuth, Lajos and grf Szchenyi, Istvn and John von Neumann and Donald E. Knuth and Strunk, Jr., William and Knzy, ifj., Jen and L. R. McColvin and Tindi Lantos, Sebestyn and Molnr-Sska, Balzs and Claude Lvi-Strauss and Kis, Pter Pl and Mary-Claire van Leunen and Paul Gerhard Hoel and G. Bernard Godfrey and II., Jnos-Pl and {Szerencsejtk Rt.} and {\empty Earl of} Traquair and Horace [pseud.] Hunt and Verne, {\empty Gy}ula" 's := + % init.nfmts s #1 nfmt0 format.name$ warning$ + % ss #385 #1 substring$ warning$ + % "fo{\'o}\oe{\H u}s{\HON}{\HANT}" rmbrace.accs warning$ % to "fo\'o\oe\H us{\HON}{\HANT}" + % "fr\'e ncia" purify$ warning$ + % "bar" #-1 #1 substring$ warning$ + % "5~janu\'ar" #1 "{ll~~}{ff{}}" format.name$ warning$ + % "janu\'ar" #1 "{ll}{~ff.}" format.name$ warning$ + % "{\null Gy}urgyk" #1 "{l}/" format.name$ warning$ + % "AzBrvztr~tkrfrgp" rmacc.latin2 warning$ + % "fogbar" #3 #1 substring$ warning$ + % "Az rvztr tkrfrgp" sortify warning$ + % "Marjai, Imre and Pataky, Dnes" rmacc.latin2 warning$ + % "{\empty\'\i}purify" purify$ warning$ + % "grof Szechenyi, Istvan" #1 "{ll}/{ff}/{jj}/{vv}" format.name$ warning$ + % "John von Neumann" #1 "{ll}/{ff}/{jj}/{vv}" format.name$ warning$ + % "Tindi Lantos, Sebestyn" #1 "{ll}/{ff}/{jj}/{vv}" format.name$ warning$ + % "II., Janos., Pal" #1 "{ll}/{ff}/{jj}/{vv}" format.name$ warning$ + % "lom" "u" change.case$ warning$ % "LOM" + % "{\'a}lom" "u" change.case$ warning$ % "{\'A}LOM" + %"alma{\ss}t" purify$ warning$ % alma{\ss}t + %"alma{\dj}t" purify$ warning$ % almat (!) + % "egykor{\th}Alma korte" rmbrace.extrat1 warning$ +} +EXECUTE {what} diff --git a/src/include/declaration.tex b/src/include/declaration.tex new file mode 100644 index 0000000..d8522be --- /dev/null +++ b/src/include/declaration.tex @@ -0,0 +1,32 @@ +\selectlanguage{magyar} +\pagenumbering{gobble} +%-------------------------------------------------------------------------------------- +% Nyilatkozat +%-------------------------------------------------------------------------------------- +\begin{center} +\large +\textbf{HALLGATÓI NYILATKOZAT}\\ +\end{center} + +Alulírott \emph{\vikszerzoVezeteknev{} \vikszerzoKeresztnev}, szigorló hallgató kijelentem, hogy ezt a \vikmunkatipusat{} meg nem engedett segítség nélkül, saját magam készítettem, csak a megadott forrásokat (szakirodalom, eszközök stb.) használtam fel. Minden olyan részt, melyet szó szerint, vagy azonos értelemben, de átfogalmazva más forrásból átvettem, egyértelműen, a forrás megadásával megjelöltem. + +Hozzájárulok, hogy a jelen munkám alapadatait (szerző(k), cím, angol és magyar nyelvű tartalmi kivonat, készítés éve, konzulens(ek) neve) a BME VIK nyilvánosan hozzáférhető elektronikus formában, a munka teljes szövegét pedig az egyetem belső hálózatán keresztül (vagy autentikált felhasználók számára) közzétegye. Kijelentem, hogy a benyújtott munka és annak elektronikus verziója megegyezik. Dékáni engedéllyel titkosított diplomatervek esetén a dolgozat szövege csak 3 év eltelte után válik hozzáférhetővé. + +\begin{flushleft} +\vspace*{1cm} +Budapest, \today +\end{flushleft} + +\begin{flushright} + \vspace*{1cm} + \makebox[7cm]{\rule{6cm}{.4pt}}\\ + \makebox[7cm]{\emph{\vikszerzoVezeteknev{} \vikszerzoKeresztnev}}\\ + \makebox[7cm]{hallgató} +\end{flushright} +\thispagestyle{empty} + +\vfill +\clearpage +\thispagestyle{empty} % an empty page + +\selectthesislanguage diff --git a/src/include/guideline.tex b/src/include/guideline.tex new file mode 100644 index 0000000..86e3f94 --- /dev/null +++ b/src/include/guideline.tex @@ -0,0 +1,54 @@ +\selecthungarian +%-------------------------------------------------------------------------------------- +% Rovid formai es tartalmi tajekoztato +%-------------------------------------------------------------------------------------- + +\footnotesize +\begin{center} +\large +\textbf{\Large Általános információk, a diplomaterv szerkezete}\\ +\end{center} + +A diplomaterv szerkezete a BME Villamosmérnöki és Informatikai Karán: +\begin{enumerate} +\item Diplomaterv feladatkiírás +\item Címoldal +\item Tartalomjegyzék +\item A diplomatervező nyilatkozata az önálló munkáról és az elektronikus adatok kezeléséről +\item Tartalmi összefoglaló magyarul és angolul +\item Bevezetés: a feladat értelmezése, a tervezés célja, a feladat indokoltsága, a diplomaterv felépítésének rövid összefoglalása +\item A feladatkiírás pontosítása és részletes elemzése +\item Előzmények (irodalomkutatás, hasonló alkotások), az ezekből levonható következtetések +\item A tervezés részletes leírása, a döntési lehetőségek értékelése és a választott megoldások indoklása +\item A megtervezett műszaki alkotás értékelése, kritikai elemzése, továbbfejlesztési lehetőségek +\item Esetleges köszönetnyilvánítások +\item Részletes és pontos irodalomjegyzék +\item Függelék(ek) +\end{enumerate} + +Felhasználható a következő oldaltól kezdődő \LaTeX diplomatervsablon dokumentum tartalma. + +A diplomaterv szabványos méretű A4-es lapokra kerüljön. Az oldalak tükörmargóval készüljenek (mindenhol 2,5~cm, baloldalon 1~cm-es kötéssel). Az alapértelmezett betűkészlet a 12 pontos Times New Roman, másfeles sorközzel, de ettől kismértékben el lehet térni, ill. más betűtípus használata is megengedett. + +Minden oldalon -- az első négy szerkezeti elem kivételével -- szerepelnie kell az oldalszámnak. + +A fejezeteket decimális beosztással kell ellátni. Az ábrákat a megfelelő helyre be kell illeszteni, fejezetenként decimális számmal és kifejező címmel kell ellátni. A fejezeteket decimális aláosztással számozzuk, maximálisan 3 aláosztás mélységben (pl. 2.3.4.1.). Az ábrákat, táblázatokat és képleteket célszerű fejezetenként külön számozni (pl. 2.4. ábra, 4.2. táblázat vagy képletnél (3.2)). A fejezetcímeket igazítsuk balra, a normál szövegnél viszont használjunk sorkiegyenlítést. Az ábrákat, táblázatokat és a hozzájuk tartozó címet igazítsuk középre. A cím a jelölt rész alatt helyezkedjen el. + +A képeket lehetőleg rajzoló programmal készítsék el, az egyenleteket egyenlet-szerkesztő segítségével írják le (A \LaTeX~ehhez kézenfekvő megoldásokat nyújt). + +Az irodalomjegyzék szövegközi hivatkozása történhet sorszámozva (ez a preferált megoldás) vagy a Harvard-rendszerben (a szerző és az évszám megadásával). A teljes lista névsor szerinti sorrendben a szöveg végén szerepeljen (sorszámozott irodalmi hivatkozások esetén hivatkozási sorrendben). A szakirodalmi források címeit azonban mindig az eredeti nyelven kell megadni, esetleg zárójelben a fordítással. A listában szereplő valamennyi publikációra hivatkozni kell a szövegben (a \LaTeX-sablon a Bib\TeX~segítségével mindezt automatikusan kezeli). Minden publikáció a szerzők után a következő adatok szerepelnek: folyóirat cikkeknél a pontos cím, a folyóirat címe, évfolyam, szám, oldalszám tól-ig. A folyóiratok címét csak akkor rövidítsük, ha azok nagyon közismertek vagy nagyon hosszúak. Internetes hivatkozások megadásakor fontos, hogy az elérési út előtt megadjuk az oldal tulajdonosát és tartalmát (mivel a link egy idő után akár elérhetetlenné is válhat), valamint az elérés időpontját. + +\vspace{5mm} +Fontos: +\begin{itemize} + \item A szakdolgozatkészítő / diplomatervező nyilatkozata (a jelen sablonban szereplő szövegtartalommal) kötelező előírás, Karunkon ennek hiányában a szakdolgozat/diplomaterv nem bírálható és nem védhető! + \item Mind a dolgozat, mind a melléklet maximálisan 15~MB méretű lehet! +\end{itemize} + +\vspace{5mm} +\begin{center} +Jó munkát, sikeres szakdolgozatkészítést, ill. diplomatervezést kívánunk! +\end{center} + +\normalsize +\selectthesislanguage diff --git a/src/include/packages.tex b/src/include/packages.tex new file mode 100644 index 0000000..bd90e7e --- /dev/null +++ b/src/include/packages.tex @@ -0,0 +1,73 @@ +% !TeX root = ../thesis.tex +% thanks to http://tex.stackexchange.com/a/47579/71109 +\usepackage{ifxetex} +\usepackage{ifluatex} +\newif\ifxetexorluatex % a new conditional starts as false +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi>0 + \xetexorluatextrue +\fi + +\ifxetexorluatex + \usepackage{fontspec} +\else + \usepackage[T1]{fontenc} + \usepackage[utf8]{inputenc} + \usepackage[lighttt]{lmodern} +\fi + +\usepackage[english,magyar]{babel} % Alapértelmezés szerint utoljára definiált nyelv lesz aktív, de később külön beállítjuk az aktív nyelvet. + +%\usepackage{cmap} +\usepackage{amsfonts,amsmath,amssymb} % Mathematical symbols. +%\usepackage[ruled,boxed,resetcount,linesnumbered]{algorithm2e} % For pseudocodes. % beware: this is not compatible with LuaLaTeX, see http://tex.stackexchange.com/questions/34814/lualatex-and-algorithm2e +\usepackage{booktabs} % For publication quality tables for LaTeX +\usepackage{graphicx} + +\usepackage{listings} + +%\usepackage{fancyhdr} +%\usepackage{lastpage} + +\usepackage{anysize} +%\usepackage{sectsty} +\usepackage{setspace} % For setting line spacing + +\usepackage[unicode]{hyperref} % For hyperlinks in the generated document. +\usepackage{xcolor} +\usepackage{listings} % For source code snippets. + +\usepackage[amsmath,thmmarks]{ntheorem} % Theorem-like environments. + +\usepackage[hang]{caption} + +\singlespacing + +\newcommand{\selecthungarian}{ + \selectlanguage{magyar} + \setlength{\parindent}{2em} + \setlength{\parskip}{0em} + \frenchspacing +} + +\newcommand{\selectenglish}{ + \selectlanguage{english} + \setlength{\parindent}{0em} + \setlength{\parskip}{0.5em} + \nonfrenchspacing + \renewcommand{\figureautorefname}{Figure} + \renewcommand{\tableautorefname}{Table} + \renewcommand{\partautorefname}{Part} + \renewcommand{\chapterautorefname}{Chapter} + \renewcommand{\sectionautorefname}{Section} + \renewcommand{\subsectionautorefname}{Section} + \renewcommand{\subsubsectionautorefname}{Section} +} + +\usepackage[numbers]{natbib} +\usepackage{xspace} + +\usepackage{tikz} +\usepackage{pgfplots} +\pgfplotsset{compat=1.6} + +\PassOptionsToPackage{hyphens}{url}\usepackage{hyperref} diff --git a/src/include/preamble.tex b/src/include/preamble.tex new file mode 100644 index 0000000..7b2e514 --- /dev/null +++ b/src/include/preamble.tex @@ -0,0 +1,125 @@ +%-------------------------------------------------------------------------------------- +% Page layout setup +%-------------------------------------------------------------------------------------- +% we need to redefine the pagestyle plain +% another possibility is to use the body of this command without \fancypagestyle +% and use \pagestyle{fancy} but in that case the special pages +% (like the ToC, the References, and the Chapter pages)remain in plane style + +\pagestyle{plain} +\marginsize{35mm}{25mm}{15mm}{15mm} + +\setcounter{tocdepth}{3} +%\sectionfont{\large\upshape\bfseries} +\setcounter{secnumdepth}{3} + +\sloppy % Margón túllógó sorok tiltása. +\widowpenalty=10000 \clubpenalty=10000 %A fattyú- és árvasorok elkerülése +\def\hyph{-\penalty0\hskip0pt\relax} % Kötőjeles szavak elválasztásának engedélyezése + + +%-------------------------------------------------------------------------------------- +% Setup hyperref package +%-------------------------------------------------------------------------------------- +\hypersetup{ + % bookmarks=true, % show bookmarks bar? + unicode=true, % non-Latin characters in Acrobat's bookmarks + pdftitle={\vikcim}, % title + pdfauthor={\szerzoMeta}, % author + pdfsubject={\vikdoktipus}, % subject of the document + pdfcreator={\szerzoMeta}, % creator of the document + pdfproducer={}, % producer of the document + pdfkeywords={}, % list of keywords (separate then by comma) + pdfnewwindow=true, % links in new window + colorlinks=true, % false: boxed links; true: colored links + linkcolor=black, % color of internal links + citecolor=black, % color of links to bibliography + filecolor=black, % color of file links + urlcolor=black % color of external links +} + + +%-------------------------------------------------------------------------------------- +% Set up listings +%-------------------------------------------------------------------------------------- +\definecolor{lightgray}{rgb}{0.95,0.95,0.95} +\lstset{ + basicstyle=\scriptsize\ttfamily, % print whole listing small + keywordstyle=\color{black}\bfseries, % bold black keywords + identifierstyle=, % nothing happens + % default behavior: comments in italic, to change use + % commentstyle=\color{green}, % for e.g. green comments + stringstyle=\scriptsize, + showstringspaces=false, % no special string spaces + aboveskip=3pt, + belowskip=3pt, + backgroundcolor=\color{lightgray}, + columns=flexible, + keepspaces=true, + escapeinside={(*@}{@*)}, + captionpos=b, + breaklines=true, + frame=single, + float=!ht, + tabsize=2, + literate=* + {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ö}{{\"o}}1 {ő}{{\H{o}}}1 {ú}{{\'u}}1 {ü}{{\"u}}1 {ű}{{\H{u}}}1 + {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ö}{{\"O}}1 {Ő}{{\H{O}}}1 {Ú}{{\'U}}1 {Ü}{{\"U}}1 {Ű}{{\H{U}}}1 +} + + +%-------------------------------------------------------------------------------------- +% Set up theorem-like environments +%-------------------------------------------------------------------------------------- +% Using ntheorem package -- see http://www.math.washington.edu/tex-archive/macros/latex/contrib/ntheorem/ntheorem.pdf + +\theoremstyle{plain} +\theoremseparator{.} +\newtheorem{example}{\pelda} + +\theoremseparator{.} +%\theoremprework{\bigskip\hrule\medskip} +%\theorempostwork{\hrule\bigskip} +\theorembodyfont{\upshape} +\theoremsymbol{{\large \ensuremath{\centerdot}}} +\newtheorem{definition}{\definicio} + +\theoremseparator{.} +%\theoremprework{\bigskip\hrule\medskip} +%\theorempostwork{\hrule\bigskip} +\newtheorem{theorem}{\tetel} + + +%-------------------------------------------------------------------------------------- +% Some new commands and declarations +%-------------------------------------------------------------------------------------- +\newcommand{\code}[1]{{\upshape\ttfamily\scriptsize\indent #1}} +\newcommand{\doi}[1]{DOI: \href{http://dx.doi.org/\detokenize{#1}}{\raggedright{\texttt{\detokenize{#1}}}}} % A hivatkozások közt így könnyebb DOI-t megadni. + +\DeclareMathOperator*{\argmax}{arg\,max} +%\DeclareMathOperator*[1]{\floor}{arg\,max} +\DeclareMathOperator{\sign}{sgn} +\DeclareMathOperator{\rot}{rot} + + +%-------------------------------------------------------------------------------------- +% Setup captions +%-------------------------------------------------------------------------------------- +\captionsetup[figure]{ + width=.75\textwidth, + aboveskip=10pt} + +\renewcommand{\captionlabelfont}{\bf} +%\renewcommand{\captionfont}{\footnotesize\it} + +%-------------------------------------------------------------------------------------- +% Hyphenation exceptions +%-------------------------------------------------------------------------------------- +\hyphenation{Shakes-peare Mar-seilles ár-víz-tű-rő tü-kör-fú-ró-gép} + + +\author{\vikszerzo} +\title{\viktitle} + +\renewcommand{\lstlistingname}{K\'odr\'eszlet}% Listing -> Algorithm +\renewcommand{\lstlistlistingname}{List of \lstlistingname s}% List of Listings -> List of Algorithms diff --git a/src/include/project.tex b/src/include/project.tex new file mode 100644 index 0000000..313cc4e --- /dev/null +++ b/src/include/project.tex @@ -0,0 +1,10 @@ +%-------------------------------------------------------------------------------------- +% Feladatkiiras (a tanszeken atveheto, kinyomtatott valtozat) +%-------------------------------------------------------------------------------------- +\clearpage +\begin{center} +\large +\textbf{FELADATKIÍRÁS}\\ +\end{center} + +A feladatkiírást a tanszéki adminisztrációban lehet átvenni, és a leadott munkába eredeti, tanszéki pecséttel ellátott és a tanszékvezető által aláírt lapot kell belefűzni (ezen oldal \emph{helyett}, ez az oldal csak útmutatás). Az elektronikusan feltöltött dolgozatban már nem kell beleszerkeszteni ezt a feladatkiírást. diff --git a/src/include/tdk-variables.tex b/src/include/tdk-variables.tex new file mode 100644 index 0000000..3408e12 --- /dev/null +++ b/src/include/tdk-variables.tex @@ -0,0 +1,11 @@ +%-------------------------------------------------------------------------------------- +% TDK-specifikus változók +%-------------------------------------------------------------------------------------- +\newcommand{\tdkszerzoB}{Második Szerző} % Második szerző neve; hagyd üresen, ha egyedül írtad a TDK-t. +\newcommand{\tdkev}{2014} % A dolgozat írásának éve (pl. "2014") (Ez OTDK-nál eltérhet az aktuális évtől.) + +% További adatok az OTDK címlaphoz (BME-s TDK-hoz nem kell kitölteni) +\newcommand{\tdkevfolyamA}{IV} % Első szerző évfolyama, római számmal (pl. IV). +\newcommand{\tdkevfolyamB}{III} % Második szerző évfolyama, római számmal (pl. III). +\newcommand{\tdkkonzulensbeosztasA}{egyetemi tanár} % Első konzulens beosztása (pl. egyetemi docens) +\newcommand{\tdkkonzulensbeosztasB}{doktorandusz} % Második konzulens beosztása (pl. egyetemi docens) diff --git a/src/include/thesis-en.tex b/src/include/thesis-en.tex new file mode 100644 index 0000000..50cb082 --- /dev/null +++ b/src/include/thesis-en.tex @@ -0,0 +1,57 @@ +%-------------------------------------------------------------------------------------- +% Elnevezések +%-------------------------------------------------------------------------------------- +\newcommand{\bme}{Budapest University of Technology and Economics} +\newcommand{\vik}{Faculty of Electrical Engineering and Informatics} + +\newcommand{\bmemit}{Department of Measurement and Information Systems} +\newcommand{\bmetmit}{Department of Telecommunications and Media Informatics} + +\newcommand{\keszitette}{Author} +\newcommand{\konzulens}{Advisor} + +\newcommand{\bsc}{Bachelor's Thesis} +\newcommand{\msc}{Master's Thesis} +\newcommand{\tdk}{Scientific Students' Association Report} +\newcommand{\bsconlab}{BSc Project Laboratory} +\newcommand{\msconlabi}{MSc Project Laboratory 1} +\newcommand{\msconlabii}{MSc Project Laboratory 2} + +\newcommand{\pelda}{Example} +\newcommand{\definicio}{Definition} +\newcommand{\tetel}{Theorem} + +\newcommand{\bevezetes}{Introduction} +\newcommand{\koszonetnyilvanitas}{Acknowledgements} +\newcommand{\fuggelek}{Appendix} + +% Optional custom titles +%\addto\captionsenglish{% +%\renewcommand*{\listfigurename}{Your list of figures title} +%\renewcommand*{\listtablename}{Your list of tables title} +%\renewcommand*{\bibname}{Your bibliography title} +%} + +\newcommand{\szerzo}{\vikszerzoKeresztnev{} \vikszerzoVezeteknev} +\newcommand{\vikkonzulensA}{\vikkonzulensAMegszolitas\vikkonzulensAKeresztnev{} \vikkonzulensAVezeteknev} +\newcommand{\vikkonzulensB}{\vikkonzulensBMegszolitas\vikkonzulensBKeresztnev{} \vikkonzulensBVezeteknev} +\newcommand{\vikkonzulensC}{\vikkonzulensCMegszolitas\vikkonzulensCKeresztnev{} \vikkonzulensCVezeteknev} + +\newcommand{\selectthesislanguage}{\selectenglish} + +\bibliographystyle{unsrt} + +\newcommand{\ie}{i.e.\@\xspace} +\newcommand{\Ie}{I.e.\@\xspace} +\newcommand{\eg}{e.g.\@\xspace} +\newcommand{\Eg}{E.g.\@\xspace} +\newcommand{\etal}{et al.\@\xspace} +\newcommand{\etc}{etc.\@\xspace} +\newcommand{\vs}{vs.\@\xspace} +\newcommand{\viz}{viz.\@\xspace} % videlicet +\newcommand{\cf}{cf.\@\xspace} % confer +\newcommand{\Cf}{Cf.\@\xspace} +\newcommand{\wrt}{w.r.t.\@\xspace} % with respect to +\newcommand{\approximately}{approx.\@\xspace} + +\newcommand{\appendixnumber}{1} % a fofejezet-szamlalo az angol ABC 1. betuje (A) lesz diff --git a/src/include/thesis-hu.tex b/src/include/thesis-hu.tex new file mode 100644 index 0000000..29335e9 --- /dev/null +++ b/src/include/thesis-hu.tex @@ -0,0 +1,46 @@ +%-------------------------------------------------------------------------------------- +% Elnevezések +%-------------------------------------------------------------------------------------- +\newcommand{\bme}{Budapesti Műszaki és Gazdaságtudományi Egyetem} +\newcommand{\vik}{Villamosmérnöki és Informatikai Kar} + +\newcommand{\bmemit}{Méréstechnika és Információs Rendszerek Tanszék} +\newcommand{\bmetmit}{Távközlési és Médiainformatikai Tanszék} + +\newcommand{\keszitette}{Készítette} +\newcommand{\konzulens}{Konzulens} + +\newcommand{\bsc}{Szakdolgozat} +\newcommand{\msc}{Diplomaterv} +\newcommand{\tdk}{TDK dolgozat} +\newcommand{\bsconlab}{BSc Önálló laboratórium} +\newcommand{\msconlabi}{MSc Önálló laboratórium 1.} +\newcommand{\msconlabii}{MSc Önálló laboratórium 2.} + +\newcommand{\pelda}{Példa} +\newcommand{\definicio}{Definíció} +\newcommand{\tetel}{Tétel} + +\newcommand{\bevezetes}{Bevezetés} +\newcommand{\koszonetnyilvanitas}{Köszönetnyilvánítás} +\newcommand{\fuggelek}{Függelék} + +% Opcionálisan átnevezhető címek +%\addto\captionsmagyar{% +%\renewcommand{\listfigurename}{Saját ábrajegyzék cím} +%\renewcommand{\listtablename}{Saját táblázatjegyzék cím} +%\renewcommand{\bibname}{Saját irodalomjegyzék név} +%} + +\newcommand{\szerzo}{\vikszerzoVezeteknev{} \vikszerzoKeresztnev} +\newcommand{\vikkonzulensA}{\vikkonzulensAMegszolitas\vikkonzulensAVezeteknev{} \vikkonzulensAKeresztnev} +\newcommand{\vikkonzulensB}{\vikkonzulensBMegszolitas\vikkonzulensBVezeteknev{} \vikkonzulensBKeresztnev} +\newcommand{\vikkonzulensC}{\vikkonzulensCMegszolitas\vikkonzulensCVezeteknev{} \vikkonzulensCKeresztnev} + +\newcommand{\selectthesislanguage}{\selecthungarian} + +\bibliographystyle{unsrt} + +\def\lstlistingname{lista} + +\newcommand{\appendixnumber}{6} % a fofejezet-szamlalo az angol ABC 6. betuje (F) lesz diff --git a/src/include/titlepage-otdk.tex b/src/include/titlepage-otdk.tex new file mode 100644 index 0000000..54ecb05 --- /dev/null +++ b/src/include/titlepage-otdk.tex @@ -0,0 +1,58 @@ +%% OTDK külső címlap +\begin{titlepage} + $\;$ + \vspace{5cm} + + \begin{center} + \Huge + \textbf{TDK-dolgozat}\let\thefootnote\relax\footnote{A dolgozat bemutatását a XXXXXXXXX ``Lorem ipsum dolor sit amet'' című program támogatta.} + \end{center} + + \vspace{13cm} + + \Large + \hspace{8cm} \szerzo + + \hspace{8cm} \tdkszerzoB + + \hspace{8cm} \tdkev. +\end{titlepage} + +\newpage +\thispagestyle{empty} + + +%% OTDK belső címlap +\begin{titlepage} + \begin{center} + \includegraphics[width=7cm]{./figures/bme_logo.pdf} + \vspace{0.3cm} + + \bme \\ + \vik \\ + \viktanszek \\ + \vspace{3.5cm} + + \huge {\vikcim} + \vspace{1.5cm} + + \large {\textbf{\vikdoktipus}} + \vfill + + {\Large + {\large \keszitette:} \\ \vspace{0.2cm} + \szerzo \\ \tdkevfolyamA. évfolyam \\ + \vspace{0.5cm} + \tdkszerzoB \\ \tdkevfolyamB. évfolyam \\ + \vspace{1.5cm} + {\large \konzulens:} \\ \vspace{0.2cm} + \vikkonzulensA,\\ \tdkkonzulensbeosztasA \\ + \vspace{0.5cm} + \vikkonzulensB,\\ \tdkkonzulensbeosztasB \\ + } + + \vspace{2cm} + \large {\tdkev.} + + \end{center} +\end{titlepage} \ No newline at end of file diff --git a/src/include/titlepage-tdk.tex b/src/include/titlepage-tdk.tex new file mode 100644 index 0000000..fdd3bb3 --- /dev/null +++ b/src/include/titlepage-tdk.tex @@ -0,0 +1,32 @@ +%% TDK címlap +\begin{titlepage} + \begin{center} + \includegraphics[width=7cm]{./figures/bme_logo.pdf} + \vspace{0.3cm} + + \bme \\ + \vik \\ + \viktanszek \\ + \vspace{5cm} + + \huge {\vikcim} + \vspace{1.5cm} + + \large {\textbf{\tdk}} + \vfill + + {\Large + \keszitette: \\ \vspace{0.3cm} + \szerzo \\ + \tdkszerzoB \\ + \vspace{1.5cm} + \konzulens: \\ \vspace{0.3cm} + \vikkonzulensA \\ + \vikkonzulensB \\ + } + + \vspace{2cm} + \large {\tdkev} + \end{center} +\end{titlepage} +%% Címlap vége diff --git a/src/include/titlepage.tex b/src/include/titlepage.tex new file mode 100644 index 0000000..b7835dd --- /dev/null +++ b/src/include/titlepage.tex @@ -0,0 +1,33 @@ +\hypersetup{pageanchor=false} +%-------------------------------------------------------------------------------------- +% The title page +%-------------------------------------------------------------------------------------- +\begin{titlepage} +\begin{center} +\includegraphics[width=60mm,keepaspectratio]{figures/bme_logo.pdf}\\ +\vspace{0.3cm} +\textbf{\bme}\\ +\textmd{\vik}\\ +\textmd{\viktanszek}\\[5cm] + +\vspace{0.4cm} +{\huge \bfseries \vikcim}\\[0.8cm] +\vspace{0.5cm} +\textsc{\Large \vikdoktipus}\\[4cm] + +{ + \renewcommand{\arraystretch}{0.85} + \begin{tabular}{cc} + \makebox[7cm]{\emph{\keszitette}} & \makebox[7cm]{\emph{\konzulens}} \\ \noalign{\smallskip} + \makebox[7cm]{\szerzo} & \makebox[7cm]{\vikkonzulensA} \\ + & \makebox[7cm]{\vikkonzulensB} \\ + & \makebox[7cm]{\vikkonzulensC} \\ + \end{tabular} +} + +\vfill +{\large \today} +\end{center} +\end{titlepage} +\hypersetup{pageanchor=false} + diff --git a/src/lua/language.dat.lua b/src/lua/language.dat.lua new file mode 100644 index 0000000..cd0d9e4 --- /dev/null +++ b/src/lua/language.dat.lua @@ -0,0 +1,731 @@ +-- Generated by ./install-tl on Sun Feb 12 19:17:26 2017 +-- $Id: language.us.lua 18737 2010-06-04 17:09:02Z karl $ +--[[ +language.us.dat (and the start of language.dat.lua), used by: +- a special luatex version of hyphen.cfg (derived from the babel system); +- a special luatex version of etex.src (from the e-TeX distributon). + +See luatex-hyphen.pdf (currently part of the hyph-utf8 package) for details. + +DO NOT EDIT THIS FILE (language.dat.lua)! It is generated by tlmgr. +See language.dat (or language.us) for more information. + +Warning: formats using this file also use one of language.dat or +language.def. Update them accordingly. The interaction between these +files is documented in luatex-hyphen.pdf, but here is a summary: +- a language must be mentioned in language.dat or language.def to be +available; if, in addition, it is: + - not mentioned in language.dat.lua, then it is dumped in the format; + - mentioned in language.dat.lua with a key special="disabled:", + then it is not available at all; + - mentioned in language.dat.lua with a normal entry, then it will not + be dumped in the format, but loaded at runtime when activated. +]] + +return { + ["english"]={ + loader="hyphen.tex", + special="language0", -- should be dumped in the format + lefthyphenmin=2, + righthyphenmin=3, + synonyms={"usenglish","USenglish","american"}, + }, + -- dumylang and zerohyph are dumped in the format, + -- since they contain either very few or no patterns at all +-- END of language.us.lua (missing '}' appended after all entries) +-- from dehyph-exptl: + ['german-x-2014-05-21'] = { + loader = 'dehypht-x-2014-05-21.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { 'german-x-latest' }, + patterns = 'hyph-de-1901.pat.txt', + hyphenation = 'hyph-de-1901.hyp.txt', + }, + ['ngerman-x-2014-05-21'] = { + loader = 'dehyphn-x-2014-05-21.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { 'ngerman-x-latest' }, + patterns = 'hyph-de-1996.pat.txt', + hyphenation = 'hyph-de-1996.hyp.txt', + }, +-- from hyphen-afrikaans: + ['afrikaans'] = { + loader = 'loadhyph-af.tex', + lefthyphenmin = 1, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-af.pat.txt', + hyphenation = 'hyph-af.hyp.txt', + }, +-- from hyphen-ancientgreek: + ['ancientgreek'] = { + loader = 'loadhyph-grc.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-grc.pat.txt', + hyphenation = '', + }, + ['ibycus'] = { + loader = 'ibyhyph.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + special = 'disabled:8-bit only', + }, +-- from hyphen-arabic: + ['arabic'] = { + loader = 'zerohyph.tex', + lefthyphenmin = 2, + righthyphenmin = 3, + synonyms = { }, + patterns = '', + }, +-- from hyphen-armenian: + ['armenian'] = { + loader = 'loadhyph-hy.tex', + lefthyphenmin = 1, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-hy.pat.txt', + hyphenation = '', + }, +-- from hyphen-basque: + ['basque'] = { + loader = 'loadhyph-eu.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-eu.pat.txt', + hyphenation = '', + }, +-- from hyphen-bulgarian: + ['bulgarian'] = { + loader = 'loadhyph-bg.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-bg.pat.txt', + hyphenation = '', + }, +-- from hyphen-catalan: + ['catalan'] = { + loader = 'loadhyph-ca.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-ca.pat.txt', + hyphenation = 'hyph-ca.hyp.txt', + }, +-- from hyphen-chinese: + ['pinyin'] = { + loader = 'loadhyph-zh-latn-pinyin.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-zh-latn-pinyin.pat.txt', + hyphenation = '', + }, +-- from hyphen-churchslavonic: + ['churchslavonic'] = { + loader = 'loadhyph-cu.tex', + lefthyphenmin = 1, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-cu.pat.txt', + hyphenation = 'hyph-cu.hyp.txt', + }, +-- from hyphen-coptic: + ['coptic'] = { + loader = 'loadhyph-cop.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-cop.pat.txt', + hyphenation = '', + }, +-- from hyphen-croatian: + ['croatian'] = { + loader = 'loadhyph-hr.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-hr.pat.txt', + hyphenation = '', + }, +-- from hyphen-czech: + ['czech'] = { + loader = 'loadhyph-cs.tex', + lefthyphenmin = 2, + righthyphenmin = 3, + synonyms = { }, + patterns = 'hyph-cs.pat.txt', + hyphenation = 'hyph-cs.hyp.txt', + }, +-- from hyphen-danish: + ['danish'] = { + loader = 'loadhyph-da.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-da.pat.txt', + hyphenation = '', + }, +-- from hyphen-dutch: + ['dutch'] = { + loader = 'loadhyph-nl.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-nl.pat.txt', + hyphenation = 'hyph-nl.hyp.txt', + }, +-- from hyphen-english: + ['ukenglish'] = { + loader = 'loadhyph-en-gb.tex', + lefthyphenmin = 2, + righthyphenmin = 3, + synonyms = { 'british', 'UKenglish' }, + patterns = 'hyph-en-gb.pat.txt', + hyphenation = 'hyph-en-gb.hyp.txt', + }, + ['usenglishmax'] = { + loader = 'loadhyph-en-us.tex', + lefthyphenmin = 2, + righthyphenmin = 3, + synonyms = { }, + patterns = 'hyph-en-us.pat.txt', + hyphenation = 'hyph-en-us.hyp.txt', + }, +-- from hyphen-esperanto: + ['esperanto'] = { + loader = 'loadhyph-eo.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-eo.pat.txt', + hyphenation = '', + }, +-- from hyphen-estonian: + ['estonian'] = { + loader = 'loadhyph-et.tex', + lefthyphenmin = 2, + righthyphenmin = 3, + synonyms = { }, + patterns = 'hyph-et.pat.txt', + hyphenation = '', + }, +-- from hyphen-ethiopic: + ['ethiopic'] = { + loader = 'loadhyph-mul-ethi.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { 'amharic', 'geez' }, + patterns = 'hyph-mul-ethi.pat.txt', + hyphenation = '', + }, +-- from hyphen-farsi: + ['farsi'] = { + loader = 'zerohyph.tex', + lefthyphenmin = 2, + righthyphenmin = 3, + synonyms = { 'persian' }, + patterns = '', + }, +-- from hyphen-finnish: + ['finnish'] = { + loader = 'loadhyph-fi.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-fi.pat.txt', + hyphenation = '', + }, +-- from hyphen-french: + ['french'] = { + loader = 'loadhyph-fr.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { 'patois', 'francais' }, + patterns = 'hyph-fr.pat.txt', + hyphenation = '', + }, +-- from hyphen-friulan: + ['friulan'] = { + loader = 'loadhyph-fur.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-fur.pat.txt', + hyphenation = '', + }, +-- from hyphen-galician: + ['galician'] = { + loader = 'loadhyph-gl.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-gl.pat.txt', + hyphenation = '', + }, +-- from hyphen-georgian: + ['georgian'] = { + loader = 'loadhyph-ka.tex', + lefthyphenmin = 1, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-ka.pat.txt', + hyphenation = '', + }, +-- from hyphen-german: + ['german'] = { + loader = 'loadhyph-de-1901.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-de-1901.pat.txt', + hyphenation = '', + }, + ['ngerman'] = { + loader = 'loadhyph-de-1996.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-de-1996.pat.txt', + hyphenation = '', + }, + ['swissgerman'] = { + loader = 'loadhyph-de-ch-1901.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-de-ch-1901.pat.txt', + hyphenation = '', + }, +-- from hyphen-greek: + ['monogreek'] = { + loader = 'loadhyph-el-monoton.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-el-monoton.pat.txt', + hyphenation = '', + }, + ['greek'] = { + loader = 'loadhyph-el-polyton.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { 'polygreek' }, + patterns = 'hyph-el-polyton.pat.txt', + hyphenation = '', + }, +-- from hyphen-hungarian: + ['hungarian'] = { + loader = 'loadhyph-hu.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { 'hungarian', 'magyar' }, + patterns = 'hyph-hu.pat.txt', + hyphenation = '', + }, +-- from hyphen-icelandic: + ['icelandic'] = { + loader = 'loadhyph-is.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-is.pat.txt', + hyphenation = '', + }, +-- from hyphen-indic: + ['assamese'] = { + loader = 'loadhyph-as.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-as.pat.txt', + hyphenation = '', + }, + ['bengali'] = { + loader = 'loadhyph-bn.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-bn.pat.txt', + hyphenation = '', + }, + ['gujarati'] = { + loader = 'loadhyph-gu.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-gu.pat.txt', + hyphenation = '', + }, + ['hindi'] = { + loader = 'loadhyph-hi.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-hi.pat.txt', + hyphenation = '', + }, + ['kannada'] = { + loader = 'loadhyph-kn.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-kn.pat.txt', + hyphenation = '', + }, + ['malayalam'] = { + loader = 'loadhyph-ml.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-ml.pat.txt', + hyphenation = '', + }, + ['marathi'] = { + loader = 'loadhyph-mr.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-mr.pat.txt', + hyphenation = '', + }, + ['oriya'] = { + loader = 'loadhyph-or.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-or.pat.txt', + hyphenation = '', + }, + ['panjabi'] = { + loader = 'loadhyph-pa.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-pa.pat.txt', + hyphenation = '', + }, + ['tamil'] = { + loader = 'loadhyph-ta.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-ta.pat.txt', + hyphenation = '', + }, + ['telugu'] = { + loader = 'loadhyph-te.tex', + lefthyphenmin = 1, + righthyphenmin = 1, + synonyms = { }, + patterns = 'hyph-te.pat.txt', + hyphenation = '', + }, +-- from hyphen-indonesian: + ['indonesian'] = { + loader = 'loadhyph-id.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-id.pat.txt', + hyphenation = 'hyph-id.hyp.txt', + }, +-- from hyphen-interlingua: + ['interlingua'] = { + loader = 'loadhyph-ia.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-ia.pat.txt', + hyphenation = 'hyph-ia.hyp.txt', + }, +-- from hyphen-irish: + ['irish'] = { + loader = 'loadhyph-ga.tex', + lefthyphenmin = 2, + righthyphenmin = 3, + synonyms = { }, + patterns = 'hyph-ga.pat.txt', + hyphenation = 'hyph-ga.hyp.txt', + }, +-- from hyphen-italian: + ['italian'] = { + loader = 'loadhyph-it.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-it.pat.txt', + hyphenation = '', + }, +-- from hyphen-kurmanji: + ['kurmanji'] = { + loader = 'loadhyph-kmr.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-kmr.pat.txt', + hyphenation = '', + }, +-- from hyphen-latin: + ['latin'] = { + loader = 'loadhyph-la.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-la.pat.txt', + hyphenation = '', + }, + ['classiclatin'] = { + loader = 'loadhyph-la-x-classic.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-la-x-classic.pat.txt', + hyphenation = '', + }, + ['liturgicallatin'] = { + loader = 'loadhyph-la-x-liturgic.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-la-x-liturgic.pat.txt', + hyphenation = '', + }, +-- from hyphen-latvian: + ['latvian'] = { + loader = 'loadhyph-lv.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-lv.pat.txt', + hyphenation = '', + }, +-- from hyphen-lithuanian: + ['lithuanian'] = { + loader = 'loadhyph-lt.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-lt.pat.txt', + hyphenation = '', + }, +-- from hyphen-mongolian: + ['mongolian'] = { + loader = 'loadhyph-mn-cyrl.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-mn-cyrl.pat.txt', + hyphenation = '', + }, + ['mongolianlmc'] = { + loader = 'loadhyph-mn-cyrl-x-lmc.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + special = 'disabled:only for 8bit montex with lmc encoding', + }, +-- from hyphen-norwegian: + ['bokmal'] = { + loader = 'loadhyph-nb.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { 'norwegian', 'norsk' }, + patterns = 'hyph-nb.pat.txt', + hyphenation = 'hyph-nb.hyp.txt', + }, + ['nynorsk'] = { + loader = 'loadhyph-nn.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-nn.pat.txt', + hyphenation = 'hyph-nn.hyp.txt', + }, +-- from hyphen-occitan: + ['occitan'] = { + loader = 'loadhyph-oc.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-oc.pat.txt', + hyphenation = '', + }, +-- from hyphen-piedmontese: + ['piedmontese'] = { + loader = 'loadhyph-pms.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-pms.pat.txt', + hyphenation = '', + }, +-- from hyphen-polish: + ['polish'] = { + loader = 'loadhyph-pl.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-pl.pat.txt', + hyphenation = 'hyph-pl.hyp.txt', + }, +-- from hyphen-portuguese: + ['portuguese'] = { + loader = 'loadhyph-pt.tex', + lefthyphenmin = 2, + righthyphenmin = 3, + synonyms = { 'portuges' }, + patterns = 'hyph-pt.pat.txt', + hyphenation = 'hyph-pt.hyp.txt', + }, +-- from hyphen-romanian: + ['romanian'] = { + loader = 'loadhyph-ro.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-ro.pat.txt', + hyphenation = '', + }, +-- from hyphen-romansh: + ['romansh'] = { + loader = 'loadhyph-rm.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-rm.pat.txt', + hyphenation = '', + }, +-- from hyphen-russian: + ['russian'] = { + loader = 'loadhyph-ru.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-ru.pat.txt', + hyphenation = 'hyph-ru.hyp.txt', + }, +-- from hyphen-sanskrit: + ['sanskrit'] = { + loader = 'loadhyph-sa.tex', + lefthyphenmin = 1, + righthyphenmin = 3, + synonyms = { }, + patterns = 'hyph-sa.pat.txt', + hyphenation = '', + }, +-- from hyphen-serbian: + ['serbian'] = { + loader = 'loadhyph-sr-latn.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-sh-latn.pat.txt,hyph-sh-cyrl.pat.txt', + hyphenation = 'hyph-sh-latn.hyp.txt,hyph-sh-cyrl.hyp.txt', + }, + ['serbianc'] = { + loader = 'loadhyph-sr-cyrl.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-sh-latn.pat.txt,hyph-sh-cyrl.pat.txt', + hyphenation = 'hyph-sh-latn.hyp.txt,hyph-sh-cyrl.hyp.txt', + }, +-- from hyphen-slovak: + ['slovak'] = { + loader = 'loadhyph-sk.tex', + lefthyphenmin = 2, + righthyphenmin = 3, + synonyms = { }, + patterns = 'hyph-sk.pat.txt', + hyphenation = 'hyph-sk.hyp.txt', + }, +-- from hyphen-slovenian: + ['slovenian'] = { + loader = 'loadhyph-sl.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { 'slovene' }, + patterns = 'hyph-sl.pat.txt', + hyphenation = '', + }, +-- from hyphen-spanish: + ['spanish'] = { + loader = 'loadhyph-es.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { 'espanol' }, + patterns = 'hyph-es.pat.txt', + hyphenation = '', + }, +-- from hyphen-swedish: + ['swedish'] = { + loader = 'loadhyph-sv.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-sv.pat.txt', + hyphenation = '', + }, +-- from hyphen-thai: + ['thai'] = { + loader = 'loadhyph-th.tex', + lefthyphenmin = 2, + righthyphenmin = 3, + synonyms = { }, + patterns = 'hyph-th.pat.txt', + hyphenation = '', + }, +-- from hyphen-turkish: + ['turkish'] = { + loader = 'loadhyph-tr.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-tr.pat.txt', + hyphenation = '', + }, +-- from hyphen-turkmen: + ['turkmen'] = { + loader = 'loadhyph-tk.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-tk.pat.txt', + hyphenation = '', + }, +-- from hyphen-ukrainian: + ['ukrainian'] = { + loader = 'loadhyph-uk.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-uk.pat.txt', + hyphenation = '', + }, +-- from hyphen-uppersorbian: + ['uppersorbian'] = { + loader = 'loadhyph-hsb.tex', + lefthyphenmin = 2, + righthyphenmin = 2, + synonyms = { }, + patterns = 'hyph-hsb.pat.txt', + hyphenation = 'hyph-hsb.hyp.txt', + }, +-- from hyphen-welsh: + ['welsh'] = { + loader = 'loadhyph-cy.tex', + lefthyphenmin = 2, + righthyphenmin = 3, + synonyms = { }, + patterns = 'hyph-cy.pat.txt', + hyphenation = '', + }, +} diff --git a/src/magyar.ldf b/src/magyar.ldf new file mode 100644 index 0000000..06c3961 --- /dev/null +++ b/src/magyar.ldf @@ -0,0 +1,5801 @@ +% +% magyar.ldf -- LaTeX Language Definition for `magyar' (Hungarian), v1.5c +% written and copyright (C) by P\'eter SZAB\'O +% (version 1.5 -- Early October 2003 -- February 2004 --) +% +% The newest version of this magyar.ldf is part of MagyarLaTeX, available from +% http://www.math.bme.hu/latex/ . The web page is in Hungarian language, but +% it is easy to figure out how to download the newest magyar.ldf. Please +% bookmark this link as the definitive source of the newest version. +% +% This program is free software. There is NO WARRANTY. Use at your own risk! +% You can choose any of these licenses: GNU GPL, LaTeX's license, +% Babel's license. +% +% When will magyar.ldf 1.5 be part of mainstream LaTeX / Babel? I have no +% idea, ask the maintainer of Babel. magyar.ldf 1.5 has ptebeen converted to +% magyar.dtx on June 27, 2004. That version has been submitted to the +% maintainer of the Babel package. No reply from him since then. +% +% Should magyar.ldf 1.5 be part of tetex, or should it be available as a +% supplementary package in TeX distributions? Yes, but this is the task of the +% creators of those distributions. The Debian package ``magyarlatex'', +% which supplements the teTeX shipped with Debian Woody, Sarge and Sid, +% is available from http://www.math.bme.hu/latex/dl +% (file magyarlatex-latest.deb). +% +% The author of magyar.ldf 1.5 has uploaded it to CTAN +% (http://www.ctan.org), but he doesn't re-upload regularly, because he +% doesn't have time to maintain it and re-upload it after each bugfix. If +% you think that magyar.ldf 1.5 should be on CTAN, feel free to upload a +% snapshot, since it is free software. +% +% magyar.ldf 1.5 is based on magyar.ldf 1.4. However, it has been totally +% rewritten and extended (just compare the file sizes), and it doesn't share +% code from the earlier versions anymore. However, its default configuration +% tries to be compatible with older versions. +% +% Earlier versions of file `magyar.dtx' Babel package for LaTeX version 2e +% Copyright (C) 1989--2004 by Johannes Braams, TeXniek +% Copyright (C) 1989--2004 by +% \'Arp\'ad B\'IR\'O +% J\'ozsef B\'ERCES (version 1.4c -- 2001; contains a lot of work of him) +% +% To typeset text in Hungarian, please +% +% 1. Include `magyar huhyph.tex' in language.dat, re-run initex(1) (initex +% 'latex.ini \dump') or pdfinitex(1), verify that running latex(1) displays +% the word `magyar' in the line containing `hyphenation patterns' in its +% console output. +% +% 2. In the document preamble, use +% +% \def\magyarOptions{defaults=hu-min} +% \usepackage[magyar]{babel} +% \usepackage{t1enc}% for automatic hyphenation of accented chars +% \usepackage[latin2]{inputenc}% for typing chars +% +% This file is quite long, because it implements a lot of parametric features +% related to typesetting Hungarian text with \LaTeX. Sorry. +% +% Motto: ``There is a lot to do in the future'' -- by Gyngyi Bujdos and +% Ferenc Wettl in their conference proceedings article ``On the localization +% of TeX in Hungary'', presented at EuroBachoTeX 2002. +% +% Most of the code and comments in this file are written by P\'eter Szab\'o. +% The newest version is available from http://www.math.bme.hu/latex/ +% +% The version of this file is 1.5, even when new releases come out. Please see +% the \expandafter\ProvidesLanguage line for the release date. +% + +\expandafter\ifx\csname CurrentOption\endcsname\relax + \def\CurrentOption{magyar}% +\fi +%** So `\input magyar.ldf' will work as well. +\expandafter\ifx\csname ver@babel.sty\endcsname\relax + \csname fi\endcsname + \endinput \expandafter\RequirePackage\expandafter[\CurrentOption]{babel} +\fi + +%\ProvidesFile{magyar.ldf}[1996/12/23 v1.3h Magyar support from the babel system] +%\ProvidesLanguage{magyar}[2001/03/05 v1.4c Magyar support from the babel system] +% vvv for Babel v3.7 +\expandafter\ProvidesLanguage\expandafter{\CurrentOption}[2015/11/24 v1.5c Magyar support from the babel v3.7 system] + +% Possibly do \endinput if .ldf already loaded +\expandafter\LdfInit\expandafter{\CurrentOption}{captions\CurrentOption}% + +% Fix \catcodes{} possibly screwed up by other Babel languages. +% Dat: \string`\string! could have been written as \string`! +\edef\@@magyar@restcats{% + \catcode\string`\string`\the\catcode\string``\space\space + \catcode\string`\string!\the\catcode\string`!\space\space + \catcode\string`\string*\the\catcode\string`*\space\space + \catcode\string`\string+\the\catcode\string`+\space\space + \catcode\string`\string-\the\catcode\string`-\space\space + \catcode\string`\string=\the\catcode\string`=\space\space + \catcode\string`\string|\the\catcode\string`|\space\space + \catcode\string`\string;\the\catcode\string`;\space\space + \catcode\string`\string:\the\catcode\string`:\space\space + \catcode\string`\string'\the\catcode\string`'\space\space + \catcode\string`\string"\the\catcode\string`"\space\space + \catcode\string`\string?\the\catcode\string`?\space\space + \catcode\string`\string/\the\catcode\string`/\space\space + \let\noexpand\@@magyar@restcats\noexpand\@undefined +} +\catcode\string``12 \catcode`!12 \catcode`*12 \catcode`+12 \catcode`-12 +\catcode`=12 \catcode`|12 \catcode`;12 \catcode`:12 \catcode`'12 \catcode`"12 +\catcode`?12 \catcode`/12 + +%** Expand \CurrentOption early. +\edef\@@magyar@error#1{\noexpand\PackageError{\CurrentOption.ldf}{#1}\noexpand\@ehc} + +% --- Declare options. +% +% Dat: \languageattribute{magyar}{...} and \bbl@declare@ttribute{magyar}{foo}{...} +% isn't enough for us, because it is processed +% after \usepackage[magyar]{babel}, but we need the options information +% earlier. And also it cannot contain `='. +% + +%** `\dMf foo-bar {...}' is `\def\foo-bar{...}' where `-' is a letter +\def\dMf#1 {\expandafter\def\csname#1\endcsname} +\def\magyar@@unchanged{unchanged} +\def\magyar@enumarg#1#2{% + \expandafter\ifx\csname magyar@opt@#1@@#2\endcsname\relax + \@@magyar@error{Invalid arg for option: #1 = #2}% + \else + \csname magyar@opt@#1@@#2\endcsname + \fi +} +\def\@@magyar@argw@no {0}% +\def\@@magyar@argw@weak{1}% +\def\@@magyar@argw@yes {2}% +\def\magyar@yesweaknoarg#1#2{% + \expandafter\ifx\csname @@magyar@argw@#2\endcsname\relax + \@@magyar@error{Invalid arg for option: #1 = #2\MessageBreak Must be =no, =yes or =weak}% + \else + \expandafter\edef\csname magyar@opt@@#1\endcsname{\csname @@magyar@argw@#2\endcsname}% + \fi +} + +% Declare defaults. + +%** These defaults load most of the new functionality, but try not to +%** introduce visible typographical changes over magyar.ldf v1.4. These +%** are the ovarall defaults of magyar.ldf v1.5, in case of +%** \def\magyarOptions{} (or if is missing). +%** +%** These are the defaults: (over-1.4) +%** \def\magyarOptions{ +%** accents=defaulthigh, % or =high or =low +%** active=safe, % or =problematic or =none or =onlycs +%** activeprefix=babelopt2, % or =none or =babelopt3 or =grave or =acute or =quotedbl +%** activespace=none, % or =safe or =problematic +%** afterindent=unchanged, % or =force-no or =force-yes +%** amslevelfix=fix-ams, % or =unchanged or =fix-all +%** amsuppercasefix=fix-ams, % or =unchanged or =fix-all +%** amstocnumskip=\enskip, % TeX code or --empty-- +%** amstocnumlang=all, % or =hu +%** amspostsectiondot=no, % or =unchanged +%** appendixdot=yes, % or =no % !! dokumentlni +%** az=weak, % or =yes or =no +%** babelmarkfix=yes, % or =unchanged +%** captionfix=yes, % or =unchanged +%** captions=hu, % or =unchanged +%** chapterhead=yes, % or =unchanged(=no) +%** chapternumber=unchanged, % see partnumber= +%** cjhebrewfix=yes, % or =unchanged or =onlyouter +%** classmod=yes, % or =unchanged(=no) or TeX class name +%** %defaults=over-1.4, % or =compat-1.4 or =safest or =prettiest +%** dottedtocline=fix, % or =unchanged +%** emitdate=weak, % or =no or =yes +%** extras=yes, % or =no +%** fancyhdr=hu, % or =unchanged +%** figurecaptions=hu, % or =us or =unchanged +%** frenchspacing=unchanged, % or =no or =yes +%** hang=weak, % or =no or =yes +%** hunnewlabel=yes, % or =no or =only-hu +%** hunumbers=yes, % or =no +%** hutoday=yes, % or =no +%** hyphenmins=22, % or =unchanged or two chars: \lefthyphenmin\righthyphenmin +%** hyphenation=huhyph3, % or =none or =composite or =phonetic or =huhyphn +%** hynumberline=unchanged, % or =hu +%** labelenums=unchanged, % or =hu-a or =hu-A or =hu-d +%** labelitems=unchanged, % or =hu +%** longcaption=justified, % or =centered or =centernewline or =none (=unchanged) +%** mathbrk=define, % or =unchanged or =fix +%** mathhucomma=define, % or =unchanged or =fix +%** mathfactorial=define, % or =unchanged or =fix +%** mathmuskips=unchanged, % or =latex or =hu +%** mathreal=weak, % or =no or =yes +%** mond=weak, % or =no or =yes +%** ntheoremfix=yes, % or =unchanged +%** openqq=maybedown, % or =up or =down or =unchanged +%** partnumber=unchanged, % or =huordinal or =Huordinal +%** postdescription=unchanged, % see postpara= +%** postpara=unchanged, % or =bfdot or =dot or =quad or =diamond or =enskip or =quad or =em or =empty ... (\magyar@post@...) +%** postsubpara=unchanged, % see postpara= +%** refstruc=weak, % or =no or =yes +%** %safest=no, % or =yes (safest=no has no effect, safest=yes is equivalent to defaults=safest) +%** sectiondot=safe, % or =none or =problematic +%** shorthandcs=\shu, % or =none or a csname or a \cs, e.g shorthandcs=\shu +%** shortrefcmds=yes, % or =no +%** showfix=yes, % or =unchanged +%** suggestions=yes, % or =no +%** tablecaptions=hu, % or =us or =unchanged +%** textqq=weak, % or =no or =yes +%** theoremtitle=hu, % or =unchanged +%** footnote=yes, % or =unchanged or =huplain or =starplain +%** titles=\enskip, % TeX code: =unchanged, =\quad or other +%** toclang=good, % or =badfloat or =badall or =unchanged +%** told=weak, % or =no or =yes +%** varioref=hu, % or =unchanged +%** }\usepackage[magyar]{babel} +\dMf magyar@opt@defaults@@over-1.4 {% + \magyar@opt@accents@@defaulthigh + \magyar@opt@active@@safe + \magyar@opt@activeprefix{activeprefix}{babelopt2}% + \magyar@opt@activespace@@none + \magyar@opt@afterindent@@unchanged + \magyar@opt@amslevelfix{amslevelfix}{fix-ams}% + \magyar@opt@amsuppercasefix{amsuppercasefix}{fix-ams}% + \magyar@opt@amspostsectiondot@@no% change over 1.4 + \magyar@opt@amstocnumlang@@all + \magyar@opt@amstocnumskip{amstocnumskip}{\enskip}% change over 1.4 + \magyar@opt@appendixdot@@yes + \magyar@opt@babelmarkfix@@yes + \magyar@opt@az{az}{weak}% + \magyar@opt@captionfix@@yes + \magyar@opt@captions@@hu + \magyar@opt@chapternumber@@unchanged + \magyar@opt@classmod@@yes + \magyar@opt@dottedtocline@@fix + \magyar@opt@emitdate{emitdate}{weak}% + \magyar@opt@extras@@yes + \magyar@opt@chapterhead@@yes + \magyar@opt@fancyhdr@@hu% change over 1.4 + \magyar@opt@figurecaptions@@hu + \magyar@opt@footnote@@yes + \magyar@opt@frenchspacing@@unchanged + \magyar@opt@hang{hang}{weak}% + \magyar@opt@hunnewlabel@@yes + \magyar@opt@hunumbers@@yes + \magyar@opt@hutoday@@yes + \magyar@opt@hyphenation{hyphenation}{huhyph3-or-any}% + \magyar@opt@hyphenmins{hyphenmins}{22}% change over 1.4 Dat: Default LaTeX is {23} + \magyar@opt@labelenums@@unchanged + \magyar@opt@labelitems@@unchanged + \magyar@opt@longcaption@@justified + \magyar@opt@mathbrk@@define + \magyar@opt@mathfactorial@@define + \magyar@opt@mathhucomma@@define + \magyar@opt@mathmuskips@@unchanged + \magyar@opt@hynumberline@@unchanged + \magyar@opt@mathreal{mathreal}{weak}% + \magyar@opt@mond{mond}{weak}% + \magyar@opt@ntheoremfix@@yes + \magyar@opt@openqq@@maybedown + \magyar@opt@partnumber@@unchanged + \magyar@opt@postpara{}{unchanged}% + \magyar@opt@postsubpara{}{unchanged}% + \magyar@opt@refstruc{refstruc}{weak}% + \magyar@opt@sectiondot@@safe + \magyar@opt@shorthandcs{shorthandcs}{\shu}% + \magyar@opt@shortrefcmds@@yes + \magyar@opt@showfix@@yes + \magyar@opt@suggestions@@yes + \magyar@opt@tablecaptions@@hu + \magyar@opt@textqq{textqq}{weak}% + \magyar@opt@theoremtitle@@hu + \magyar@opt@titles{}{\enskip}% change over 1.4 + \magyar@opt@toclang@@good + \magyar@opt@told{told}{weak}% + \magyar@opt@varioref@@hu + \magyar@opt@cjhebrewfix@@yes +} + +%** These defaults try to be compatible with magyar.ldf v1.4 as much as +%** possible -- but avoids stupid, problematic, dangerous implementation +%** mistakes that would make magyar.ldf incompatible with many LaTeX +%** packages. The purpose of compat-1.4 is to make the document compilable: +%** if a fix would produce better results, but documents are compilable +%** without the fix, the fix will not be applied in compat-1.4. +%** Some very useful fixes are not applied here -- please use +%** defaults=over-1.4 to have them. Also some very nice features such +%** as \emitdate and \told are not available here. +\dMf magyar@opt@defaults@@compat-1.4 {% + \magyar@opt@accents@@defaulthigh% OK + \magyar@opt@active@@safe% we don't want =problematic + \magyar@opt@activeprefix@@grave% OK + \magyar@opt@activespace@@none% OK + \magyar@opt@afterindent@@unchanged% OK + \magyar@opt@amslevelfix@@unchanged% OK + \magyar@opt@amsuppercasefix@@unchanged% OK + \magyar@opt@amspostsectiondot@@unchanged% OK + \magyar@opt@amstocnumlang@@all% OK, irrelevant + \magyar@opt@amstocnumskip{amstocnumskip}{}% OK + \magyar@opt@appendixdot@@yes + \magyar@opt@babelmarkfix@@unchanged + \magyar@opt@az{az}{yes}% OK + \magyar@opt@captionfix@@unchanged + \magyar@opt@captions@@hu% OK + \magyar@opt@chapterhead@@yes% OK + \magyar@opt@chapternumber@@unchanged% OK + \magyar@opt@classmod@@yes% OK + \magyar@opt@dottedtocline@@unchanged% OK + \magyar@opt@emitdate{emitdate}{no}% OK + \magyar@opt@extras@@yes% OK + \magyar@opt@fancyhdr@@unchanged% OK + \magyar@opt@figurecaptions@@hu% OK + \magyar@opt@footnote@@unchanged% OK + \magyar@opt@frenchspacing@@unchanged% OK + \magyar@opt@hang{hang}{no}% OK + \magyar@opt@hunnewlabel@@yes% OK + \magyar@opt@hunumbers@@no% OK + \magyar@opt@hutoday@@yes% OK + \magyar@opt@hyphenation{hyphenation}{huhyph3-or-any}% OK + \magyar@opt@hyphenmins{hyphenmins}{unchanged}% + \magyar@opt@labelenums@@unchanged% OK + \magyar@opt@labelitems@@unchanged% OK + \magyar@opt@longcaption@@justified% OK + \magyar@opt@mathbrk@@unchanged% OK + \magyar@opt@mathhucomma@@unchanged% OK + \magyar@opt@mathfactorial@@unchanged% OK + \magyar@opt@mathmuskips@@unchanged% OK + \magyar@opt@hynumberline@@unchanged% OK + \magyar@opt@mathreal{mathreal}{no}% + \magyar@opt@mond{mond}{no}% OK + \magyar@opt@ntheoremfix@@yes% OK + \magyar@opt@openqq@@maybedown% OK + \magyar@opt@partnumber@@unchanged% OK + \magyar@opt@postpara{}{unchanged}% OK + \magyar@opt@postsubpara{}{unchanged}% OK + \magyar@opt@refstruc{refstruc}{no}% OK + \magyar@opt@sectiondot@@safe% we don't want =problematic + \magyar@opt@shorthandcs{shorthandcs}{none}% OK + \magyar@opt@shortrefcmds@@yes% OK + \magyar@opt@showfix@@yes% OK + \magyar@opt@suggestions@@no% OK -- user has explicity requested defaults=compat-1.4 + \magyar@opt@tablecaptions@@hu% OK + \magyar@opt@textqq{textqq}{no}% OK + \magyar@opt@theoremtitle@@hu% OK + \magyar@opt@titles{}{\quad}% OK -- ugly, but compatible + \magyar@opt@toclang@@good% we don't want weird errors and mischosen languages (would be =badall) + \magyar@opt@told{told}{no}% OK + \magyar@opt@varioref@@hu% was =unchanged, but varioref.sty (2000) is buggy + \magyar@opt@cjhebrewfix@@yes +} + +%** These defaults turn of most features -- the effect is similar to as if +%** magyar.ldf hasn't been loaded at all. Useful for debugging purposes. +\def\magyar@opt@defaults@@safest{% + \magyar@opt@accents@@defaulthigh + \magyar@opt@active@@none + \magyar@opt@activeprefix@@none + \magyar@opt@activespace@@none + \magyar@opt@afterindent@@unchanged + \magyar@opt@amslevelfix@@unchanged + \magyar@opt@amsuppercasefix{amsuppercasefix}{fix-ams}% + \magyar@opt@amspostsectiondot@@unchanged + \magyar@opt@amstocnumlang@@all% OK, irrelevant + \magyar@opt@amstocnumskip{amstocnumskip}{}% + \magyar@opt@appendixdot@@yes + \magyar@opt@az{az}{no}% + \magyar@opt@babelmarkfix@@yes + \magyar@opt@captionfix@@yes + \magyar@opt@captions@@unchanged + \magyar@opt@chapternumber@@unchanged + \magyar@opt@classmod@@unchanged + \magyar@opt@dottedtocline@@unchanged + \magyar@opt@emitdate{emitdate}{no}% + \magyar@opt@extras@@no + \magyar@opt@chapterhead@@no + \magyar@opt@fancyhdr@@unchanged + \magyar@opt@figurecaptions@@unchanged + \magyar@opt@footnote@@unchanged + \magyar@opt@frenchspacing@@unchanged + \magyar@opt@hang{hang}{no}% + \magyar@opt@hunnewlabel@@no + \magyar@opt@hunumbers@@no + \magyar@opt@hutoday@@no + \magyar@opt@hyphenation{hyphenation}{huhyph3-or-any}% + \magyar@opt@hyphenmins{hyphenmins}{unchanged}% + \magyar@opt@labelenums@@unchanged + \magyar@opt@labelitems@@unchanged + \magyar@opt@longcaption@@unchanged + \magyar@opt@mathbrk@@unchanged + \magyar@opt@mathhucomma@@unchanged + \magyar@opt@mathfactorial@@unchanged + \magyar@opt@mathmuskips@@unchanged + \magyar@opt@hynumberline@@unchanged + \magyar@opt@mathreal{mathreal}{no}% + \magyar@opt@mond{mond}{no}% + \magyar@opt@ntheoremfix@@unchanged + \magyar@opt@openqq@@unchanged + \magyar@opt@partnumber@@unchanged + \magyar@opt@postpara{}{unchanged}% + \magyar@opt@postsubpara{}{unchanged}% + \magyar@opt@refstruc{refstruc}{no}% + \magyar@opt@sectiondot@@none + \magyar@opt@shorthandcs{shorthandcs}{none}% + \magyar@opt@shortrefcmds@@no + \magyar@opt@showfix@@unchanged + \magyar@opt@suggestions@@yes + \magyar@opt@tablecaptions@@unchanged + \magyar@opt@textqq{textqq}{no}% + \magyar@opt@theoremtitle@@unchanged + \magyar@opt@titles{}{unchanged}% + \magyar@opt@toclang@@unchanged + \magyar@opt@told{told}{no}% + \magyar@opt@varioref@@unchanged + \magyar@opt@cjhebrewfix@@unchanged +} + +%** These defaults load almost all features, and try to do their best to make +%** the document comply to the Hungarian typography standards. Full compliance +%** is not achieved yet, and as new features are implemented, they will be +%** added to these defaults. +\def\magyar@opt@defaults@@prettiest{% + \magyar@opt@accents@@defaulthigh% {low} would have no effect with \usepackage{t1enc} + \magyar@opt@active@@safe + \magyar@opt@activeprefix{activeprefix}{babelopt2}% + \magyar@opt@activespace@@safe + \magyar@opt@afterindent@@unchanged% keep =force-no + \magyar@opt@amslevelfix{amslevelfix}{fix-ams}% + \magyar@opt@amsuppercasefix{amsuppercasefix}{fix-ams}% + \magyar@opt@amspostsectiondot@@no + \magyar@opt@amstocnumlang@@all + \magyar@opt@amstocnumskip{amstocnumskip}{\enskip}% + \magyar@opt@appendixdot@@no + \magyar@opt@az{az}{yes}% + \magyar@opt@babelmarkfix@@yes + \magyar@opt@captionfix@@yes + \magyar@opt@captions@@hu + \magyar@opt@chapternumber@@unchanged + \magyar@opt@classmod@@yes + \magyar@opt@dottedtocline@@fix + \magyar@opt@emitdate{emitdate}{yes}% + \magyar@opt@extras@@yes + \magyar@opt@chapterhead@@yes + \magyar@opt@fancyhdr@@hu + \magyar@opt@figurecaptions@@hu + \magyar@opt@footnote@@yes + \magyar@opt@frenchspacing@@yes + \magyar@opt@hang{hang}{yes}% + \magyar@opt@hunnewlabel@@yes + \magyar@opt@hunumbers@@yes + \magyar@opt@hutoday@@yes + \magyar@opt@hyphenation{hyphenation}{composite-or-any}% + \magyar@opt@hyphenmins{hyphenmins}{22}% Dat: Default LaTeX is {23} + \magyar@opt@labelenums{labelenums}{hu-a}% + \magyar@opt@labelitems@@hu + \magyar@opt@longcaption@@centered + \magyar@opt@mathbrk@@fix + \magyar@opt@mathhucomma@@fix + \magyar@opt@mathfactorial@@fix + \magyar@opt@mathmuskips@@hu + \magyar@opt@hynumberline@@hu + \magyar@opt@mathreal{mathreal}{yes}% + \magyar@opt@mond{mond}{yes}% + \magyar@opt@ntheoremfix@@yes + \magyar@opt@openqq@@maybedown + \magyar@opt@partnumber@@Huordinal + \magyar@opt@postdescription{}{dot}% + \magyar@opt@postpara{}{diamond}% + \magyar@opt@postsubpara{}{star}% + \magyar@opt@refstruc{refstruc}{yes}% + \magyar@opt@sectiondot@@safe + \magyar@opt@shorthandcs{shorthandcs}{\shu}% + \magyar@opt@shortrefcmds@@no + \magyar@opt@showfix@@yes + \magyar@opt@suggestions@@yes + \magyar@opt@tablecaptions@@hu + \magyar@opt@textqq{textqq}{yes}% + \magyar@opt@theoremtitle@@hu + \magyar@opt@titles{}{\enskip}% + \magyar@opt@toclang@@good + \magyar@opt@told{told}{yes}% + \magyar@opt@varioref@@hu + \magyar@opt@cjhebrewfix@@yes +} + +%** Expands to the \magyarOptions changes defaults=hu-min makes over +%** defaults=safest. +\def\magyar@@humin@options{% + active=safe, + activeprefix=babelopt2, + activespace=safe, + amslevelfix=fix-ams, + amspostsectiondot=no, + amstocnumlang=all, + amstocnumskip=\enskip, + appendixdot=no, + az=weak, + captions=hu, + chapterhead=yes, + cjhebrewfix=yes, + classmod=yes, + classmod=yes, + dottedtocline=fix, + emitdate=weak, + extras=yes, + fancyhdr=hu, + figurecaptions=hu, + footnote=huplain, + frenchspacing=yes, + hang=weak, + hunnewlabel=yes, + hunumbers=yes, + hutoday=yes, + hynumberline=hu, + hyphenmins=22, + labelenums=hu-d, + labelitems=hu, + longcaption=centered, + mathbrk=define, + mathbrk=fix, + mathfactorial=define, + mathhucomma=fix, + mathreal=weak, + mond=weak, + ntheoremfix=yes, + openqq=maybedown, + postdescription=dot, + postpara=diamond, + postsubpara=star, + refstruc=weak, + sectiondot=safe, + shorthandcs=\shu, + shortrefcmds=yes, + showfix=yes, + tablecaptions=hu, + textqq=weak, + theoremtitle=hu, + titles=\enskip, + toclang=good, + told=weak, + varioref=hu, +} + +%** Matches Hungarian typographic rules most closely -- and most +%** simplistically (minimally). +\dMf magyar@opt@defaults@@hu-min {% + %\csname magyar@opt@defaults@@over-1.4\endcsname + \csname magyar@opt@defaults@@safest\endcsname + % Dat: no openqq=unchanged (!) + \expandafter\magyar@doopt\magyar@@humin@options\hfuzz,% +} + +\def\magyarDumpHuMin{% + \begingroup + \typeout{} + \typeout{\expandafter\@gobble\string\% for defaults=hu-min}% + \typeout{\string\def\string\magyarOptions\expandafter\@gobble\string\{}% + \typeout{ \space defaults=safest,}% + \typeout{ \space\expandafter\@gobble\string\%}% + \def\magyar@applyopt##1##2{% + \def\reserved@a{##1=##2,}% + \typeout{ \space\expandafter\strip@prefix\meaning\reserved@a}% + }% + \expandafter\magyar@doopt\magyar@@humin@options\hfuzz,% + \typeout{\expandafter\@gobble\string\}}% + \typeout{\string\usepackage[magyar]{babel}}% + \typeout{}% + \endgroup +} + +\let\magyar@opt@defaults\magyar@enumarg +\def\magyar@opt@safest@@yes{\magyar@opt@defaults@@safest} +\def\magyar@opt@safest@@no{} +\let\magyar@opt@safest\magyar@enumarg + +% Declare normal options. + +\def\magyar@opt@titles#1#2{\def\magyar@opt@@titleskip{#2}} +\def\@@magyar@twodigitcheck#1#2#3\hfuzz#4#5{% + \csname if\ifnum0<0\string#1 \ifnum0<0\string#2 false\else true\fi\else true\fi\endcsname + \@@magyar@error{Option #4 needs [1-9][1-9], got #1#2}% + \fi +} +\def\magyar@opt@hyphenmins#1#2{% + \def\reserved@a{#2}% + \ifx\reserved@a\magyar@@unchanged + \let\magyar@opt@@hyphenmins\@empty + \else + \@@magyar@twodigitcheck#2..\hfuzz{#1}{#2}% + \def\magyar@opt@@hyphenmins{#2}% + \fi +} + +\def\magyar@opt@amstocnumskip#1#2{\def\magyar@opt@@amstocnumskip{#2}} +\def\magyar@opt@amstocnumlang@@all{\def\magyar@opt@@amstocnumlang{2}} +\def\magyar@opt@amstocnumlang@@hu {\def\magyar@opt@@amstocnumlang{1}} +\let\magyar@opt@amstocnumlang\magyar@enumarg +\def\magyar@opt@active@@none{\def\magyar@opt@@active{0}} +\def\magyar@opt@active@@onlycs{\def\magyar@opt@@active{1}} +\def\magyar@opt@active@@safe{\def\magyar@opt@@active{2}} +\def\magyar@opt@active@@problematic{\def\magyar@opt@@active{3}} +\let\magyar@opt@active\magyar@enumarg +\def\magyar@opt@activeprefix@@none {\let\magyar@opt@@activeprefix\relax} +\def\magyar@opt@activeprefix@@acute {\def\magyar@opt@@activeprefix{'}} +\def\magyar@opt@activeprefix@@grave {\def\magyar@opt@@activeprefix{`}} +\def\magyar@opt@activeprefix@@quotedbl{\def\magyar@opt@@activeprefix{"}} +\dMf magyar@opt@activeprefix@@babelopt2 {% + \@ifpackagewith{babel}{activeacute}% Dat: not expandable + {\def\magyar@opt@@activeprefix{'}}% + {\def\magyar@opt@@activeprefix{`}}% +} +\dMf magyar@opt@activeprefix@@babelopt3 {% + \@ifpackagewith{babel}{activeacute}% + {\def\magyar@opt@@activeprefix{'}}% + {\@ifpackagewith{babel}{activegrave}% + {\def\magyar@opt@@activeprefix{`}}% + {\def\magyar@opt@@activeprefix{"}}}% +} +\let\magyar@opt@activeprefix\magyar@enumarg +\def\magyar@opt@activespace@@none{\def\magyar@opt@@activespace{0}} +\def\magyar@opt@activespace@@safe{\def\magyar@opt@@activespace{2}} +\def\magyar@opt@activespace@@problematic{\def\magyar@opt@@activespace{3}} +\let\magyar@opt@activespace\magyar@enumarg +\def\magyar@opt@amspostsectiondot@@no {\def\magyar@opt@@amspostsectiondot{1}} +\def\magyar@opt@amspostsectiondot@@unchanged{\def\magyar@opt@@amspostsectiondot{0}} +\let\magyar@opt@amspostsectiondot\magyar@enumarg +\let\magyar@opt@hyphenation\magyar@enumarg +\def\magyar@opt@hyphenation@@huhyphf {\magyar@opt@hyphenation@@phonetic} +\def\magyar@opt@hyphenation@@huhyphc {\magyar@opt@hyphenation@@composite} +\expandafter\ifx\csname @OFWO\endcsname\relax +% Imp: fix --:hyphenation= reporting above +\def\magyar@opt@hyphenation@@none {\def\magyar@opt@@hyphenation{}} +\dMf magyar@opt@hyphenation@@huhyph3 {\def\magyar@opt@@hyphenation{3rN}} +\dMf magyar@opt@hyphenation@@huhyph3-or-any {\def\magyar@opt@@hyphenation{3CmhwN}} +\def\magyar@opt@hyphenation@@huhyphn {\def\magyar@opt@@hyphenation{nrN}} +\def\magyar@opt@hyphenation@@composite {\def\magyar@opt@@hyphenation{crN}} +\dMf magyar@opt@hyphenation@@composite-or-any {\def\magyar@opt@@hyphenation{cCmhwN}} +\def\magyar@opt@hyphenation@@any {\def\magyar@opt@@hyphenation{CmhwN}} +\def\magyar@opt@hyphenation@@phonetic {\def\magyar@opt@@hyphenation{frN}} +\else% report to lafmtgen.pl + \typeout{--:hyphenation-=\CurrentOption} + \def\magyar@opt@@hyphenation{}% + \def\magyar@opt@hyphenation@@none {\def\magyar@opt@@hypr{}} + \dMf magyar@opt@hyphenation@@huhyph3 {\def\magyar@opt@@hypr{\typeout{--:hyphenation=magyar3}\typeout{--:hyphenation=magyar}}} % install both for safety + \def\magyar@opt@hyphenation@@huhyphn {\def\magyar@opt@@hypr{\typeout{--:hyphenation=magyarn}\typeout{--:hyphenation=magyar}}} + \def\magyar@opt@hyphenation@@composite{\def\magyar@opt@@hypr{\typeout{--:hyphenation=magyarc}\typeout{--:hyphenation=magyar}}} + \def\magyar@opt@hyphenation@@phonetic {\def\magyar@opt@@hypr{\typeout{--:hyphenation=magyarf}}} +\fi +\def\magyar@opt@sectiondot@@none{\def\magyar@opt@@sectiondot{0}} +\def\magyar@opt@sectiondot@@safe{\def\magyar@opt@@sectiondot{1}} +\def\magyar@opt@sectiondot@@problematic{\def\magyar@opt@@sectiondot{2}} +\let\magyar@opt@sectiondot\magyar@enumarg +\def\magyar@opt@captions@@unchanged{\def\magyar@opt@@captions{0}} +\def\magyar@opt@captions@@hu{\def\magyar@opt@@captions{1}} +\let\magyar@opt@captions\magyar@enumarg +\def\magyar@opt@varioref@@unchanged{\def\magyar@opt@@varioref{0}} +\def\magyar@opt@varioref@@hu{\def\magyar@opt@@varioref{1}} +\let\magyar@opt@varioref\magyar@enumarg +\def\magyar@opt@cjhebrewfix@@unchanged{\def\magyar@opt@@cjhebrewfix{0}} +\def\magyar@opt@cjhebrewfix@@onlyouter{\def\magyar@opt@@cjhebrewfix{1}} +\def\magyar@opt@cjhebrewfix@@yes{\def\magyar@opt@@cjhebrewfix{2}} +\let\magyar@opt@cjhebrewfix\magyar@enumarg +\def\magyar@opt@fancyhdr@@unchanged{\def\magyar@opt@@fancyhdr{0}} +\def\magyar@opt@fancyhdr@@hu{\def\magyar@opt@@fancyhdr{1}} +\let\magyar@opt@fancyhdr\magyar@enumarg +\def\magyar@opt@ntheoremfix@@unchanged{\def\magyar@opt@@ntheoremfix{0}} +\def\magyar@opt@ntheoremfix@@yes{\def\magyar@opt@@ntheoremfix{1}} +\let\magyar@opt@ntheoremfix\magyar@enumarg +\def\magyar@opt@figurecaptions@@unchanged{\def\magyar@opt@@figurecaptions{0}} +\def\magyar@opt@figurecaptions@@hu{\def\magyar@opt@@figurecaptions{1}} +\def\magyar@opt@figurecaptions@@us{\def\magyar@opt@@figurecaptions{2}} +\let\magyar@opt@figurecaptions\magyar@enumarg +\def\magyar@opt@tablecaptions@@unchanged{\def\magyar@opt@@tablecaptions{0}} +\def\magyar@opt@tablecaptions@@hu{\def\magyar@opt@@tablecaptions{1}} +\def\magyar@opt@tablecaptions@@us{\def\magyar@opt@@tablecaptions{2}} +\let\magyar@opt@tablecaptions\magyar@enumarg +\def\magyar@opt@toclang@@unchanged{\def\magyar@opt@@toclang{0}}% same as =badall +\def\magyar@opt@toclang@@badall{\def\magyar@opt@@toclang{0}} +\def\magyar@opt@toclang@@badfloat{\def\magyar@opt@@toclang{1}} +\def\magyar@opt@toclang@@good{\def\magyar@opt@@toclang{2}} +\let\magyar@opt@toclang\magyar@enumarg +\def\magyar@opt@mathbrk@@unchanged{\def\magyar@opt@@mathbrk{0}} +\def\magyar@opt@mathbrk@@define{\def\magyar@opt@@mathbrk{1}} +\def\magyar@opt@mathbrk@@fix{\def\magyar@opt@@mathbrk{2}} +\let\magyar@opt@mathbrk\magyar@enumarg +\def\magyar@opt@mathfactorial@@unchanged{\def\magyar@opt@@mathfactorial{0}} +\def\magyar@opt@mathfactorial@@define{\def\magyar@opt@@mathfactorial{1}} +\def\magyar@opt@mathfactorial@@fix{\def\magyar@opt@@mathfactorial{2}} +\let\magyar@opt@mathfactorial\magyar@enumarg +\def\magyar@opt@mathhucomma@@unchanged{\def\magyar@opt@@mathhucomma{0}} +\def\magyar@opt@mathhucomma@@define{\def\magyar@opt@@mathhucomma{1}} +\def\magyar@opt@mathhucomma@@fix{\def\magyar@opt@@mathhucomma{2}} +\let\magyar@opt@mathhucomma\magyar@enumarg +\def\magyar@opt@mathmuskips@@unchanged{\def\magyar@opt@@mathmuskips{0}} +\def\magyar@opt@mathmuskips@@latex{\def\magyar@opt@@mathmuskips{1}} +\def\magyar@opt@mathmuskips@@hu{\def\magyar@opt@@mathmuskips{2}} +\let\magyar@opt@mathmuskips\magyar@enumarg +\def\magyar@opt@hynumberline@@unchanged{\def\magyar@opt@@hynumberline{0}} +\def\magyar@opt@hynumberline@@latex{\def\magyar@opt@@hynumberline{1}} +\def\magyar@opt@hynumberline@@hu{\def\magyar@opt@@hynumberline{2}} +\let\magyar@opt@hynumberline\magyar@enumarg +\def\magyar@opt@hunnewlabel@@no {\def\magyar@opt@@hunnewlabel{0}} +\dMf magyar@opt@hunnewlabel@@only-hu {\def\magyar@opt@@hunnewlabel{1}} +\def\magyar@opt@hunnewlabel@@yes{\def\magyar@opt@@hunnewlabel{2}} +\let\magyar@opt@hunnewlabel\magyar@enumarg +\def\magyar@opt@partnumber@@unchanged{\def\magyar@opt@@partnumber{0}} +\def\magyar@opt@partnumber@@huordinal{\def\magyar@opt@@partnumber{1}} +\def\magyar@opt@partnumber@@Huordinal{\def\magyar@opt@@partnumber{2}} +\let\magyar@opt@partnumber\magyar@enumarg +\def\magyar@opt@chapternumber@@unchanged{\def\magyar@opt@@chapternumber{0}} +\def\magyar@opt@chapternumber@@huordinal{\def\magyar@opt@@chapternumber{1}} +\def\magyar@opt@chapternumber@@Huordinal{\def\magyar@opt@@chapternumber{2}} +\let\magyar@opt@chapternumber\magyar@enumarg +\def\magyar@opt@accents@@high{\def\magyar@opt@@umlaut{\umlauthigh}} +\def\magyar@opt@accents@@low{\def\magyar@opt@@umlaut{\umlautlow\umlautelow}} +\def\magyar@opt@accents@@defaulthigh{\let\magyar@opt@@umlaut\@empty} +\let\magyar@opt@accents\magyar@enumarg +\def\magyar@opt@longcaption@@centered{\def\magyar@caption@centering{\centering}\def\magyar@caption@newline{\ }} +\def\magyar@opt@longcaption@@justified{\def\magyar@caption@centering{\relax}\def\magyar@caption@newline{\ }} +\def\magyar@opt@longcaption@@centernewline{\def\magyar@caption@centering{\centering}\def\magyar@caption@newline{\\\relax}} +\def\magyar@opt@longcaption@@none{\let\magyar@caption@centering\@empty} +\def\magyar@opt@longcaption@@unchanged{\let\magyar@caption@centering\@empty} +\let\magyar@opt@longcaption\magyar@enumarg +\def\magyar@opt@suggestions@@no {\def\magyar@opt@@suggestions{0}} +\def\magyar@opt@suggestions@@yes{\def\magyar@opt@@suggestions{1}} +\let\magyar@opt@suggestions\magyar@enumarg +\def\magyar@opt@appendixdot@@no {\def\@@magyar@appendixname{\appendixname}} +\def\magyar@opt@appendixdot@@yes{\def\@@magyar@appendixname{}} +\let\magyar@opt@appendixdot\magyar@enumarg +\def\magyar@opt@extras@@no {\def\magyar@opt@@extras{0}} +\def\magyar@opt@extras@@yes{\def\magyar@opt@@extras{1}} +\let\magyar@opt@extras\magyar@enumarg +\def\magyar@opt@chapterhead@@unchanged{\def\magyar@opt@@chapterhead{0}} +\def\magyar@opt@chapterhead@@no{\def\magyar@opt@@chapterhead{0}} +\def\magyar@opt@chapterhead@@yes{\def\magyar@opt@@chapterhead{1}} +\let\magyar@opt@chapterhead\magyar@enumarg +\def\magyar@opt@classmod@@no {\let\magyar@opt@@classmod\relax} +\def\magyar@opt@classmod@@unchanged{\let\magyar@opt@@classmod\relax} +\def\magyar@opt@classmod@@yes {\let\magyar@opt@@classmod\@empty} +\def\magyar@opt@classmod#1#2{% + \expandafter\ifx\csname magyar@opt@#1@@#2\endcsname\relax + \@namedef{magyar@opt@@#1}{#2}% + \else + \csname magyar@opt@#1@@#2\endcsname + \fi +} +\def\magyar@opt@shorthandcs#1#2{% + \def\reserved@a{#2}% + \def\reserved@b{none}% + \ifx\reserved@a\reserved@b + \def\magyar@opt@@shorthandcs{0}% overridable + \else + \def\magyar@opt@@shorthandcs{1}% + \ifcat\hfuzz\noexpand#2\relax% #2 is \shu \shu`tty is `tty + \def#2##1{\protect\@@magyar@shorthand}% Dat: ##1 is usually `_12 + \else + \@namedef{#2}{\protect\@@magyar@shorthand}% + \fi + \fi +} +\def\magyar@opt@hunumbers@@no{\def\magyar@opt@@hunumbers{0}} +\def\magyar@opt@hunumbers@@yes{\def\magyar@opt@@hunumbers{1}} +\let\magyar@opt@hunumbers\magyar@enumarg +\let\magyar@opt@az\magyar@yesweaknoarg +\let\magyar@opt@told\magyar@yesweaknoarg +\let\magyar@opt@textqq\magyar@yesweaknoarg +\let\magyar@opt@emitdate\magyar@yesweaknoarg +\let\magyar@opt@mathreal\magyar@yesweaknoarg +\let\magyar@opt@refstruc\magyar@yesweaknoarg +\let\magyar@opt@mond\magyar@yesweaknoarg +\let\magyar@opt@hang\magyar@yesweaknoarg +\def\magyar@opt@theoremtitle@@unchanged{\def\magyar@opt@@theoremtitle{0}} +\def\magyar@opt@theoremtitle@@hu{\def\magyar@opt@@theoremtitle{1}} +\let\magyar@opt@theoremtitle\magyar@enumarg +\def\magyar@opt@footnote@@unchanged{\def\magyar@opt@@footnote{0}} +\def\magyar@opt@footnote@@yes{\def\magyar@opt@@footnote{1}} +\def\magyar@opt@footnote@@huplain{\def\magyar@opt@@footnote{2}} +\def\magyar@opt@footnote@@starplain{\def\magyar@opt@@footnote{3}} +\let\magyar@opt@footnote\magyar@enumarg +\def\magyar@opt@hutoday@@no{\def\magyar@opt@@hutoday{0}} +\def\magyar@opt@hutoday@@yes{\def\magyar@opt@@hutoday{1}} +\let\magyar@opt@hutoday\magyar@enumarg +\def\magyar@opt@shortrefcmds@@no{\def\magyar@opt@@shortrefcmds{0}} +\def\magyar@opt@shortrefcmds@@yes{\def\magyar@opt@@shortrefcmds{1}} +\let\magyar@opt@shortrefcmds\magyar@enumarg +\def\magyar@opt@dottedtocline@@fix{\def\magyar@opt@@dottedtocline{1}} +\def\magyar@opt@dottedtocline@@unchanged{\def\magyar@opt@@dottedtocline{0}} +\let\magyar@opt@dottedtocline\magyar@enumarg +\let\magyar@opt@amslevelfix\magyar@enumarg +\def\magyar@opt@amslevelfix@@unchanged{\def\magyar@opt@@amslevelfix{0}} +\dMf magyar@opt@amslevelfix@@fix-ams {\def\magyar@opt@@amslevelfix{1}} +\dMf magyar@opt@amslevelfix@@fix-all {\def\magyar@opt@@amslevelfix{2}} +\let\magyar@opt@amsuppercasefix\magyar@enumarg +\def\magyar@opt@amsuppercasefix@@unchanged{\def\magyar@opt@@amsuppercasefix{0}} +\dMf magyar@opt@amsuppercasefix@@fix-ams {\def\magyar@opt@@amsuppercasefix{1}} +\dMf magyar@opt@amsuppercasefix@@fix-all {\def\magyar@opt@@amsuppercasefix{2}} +\let\magyar@opt@captionfix\magyar@enumarg +\def\magyar@opt@captionfix@@unchanged{\def\magyar@opt@@captionfix{0}} +\def\magyar@opt@captionfix@@yes {\def\magyar@opt@@captionfix{1}} +\let\magyar@opt@babelmarkfix\magyar@enumarg +\def\magyar@opt@babelmarkfix@@unchanged{\def\magyar@opt@@babelmarkfix{0}} +\def\magyar@opt@babelmarkfix@@yes {\def\magyar@opt@@babelmarkfix{1}} +\let\magyar@opt@showfix\magyar@enumarg +\def\magyar@opt@showfix@@unchanged{\def\magyar@opt@@showfix{0}} +\def\magyar@opt@showfix@@yes {\def\magyar@opt@@showfix{1}} +\def\magyar@opt@labelenums@@unchanged{\def\magyar@opt@@labelenums{0}} +\dMf magyar@opt@labelenums@@hu-a {\def\magyar@opt@@labelenums{1}} +\dMf magyar@opt@labelenums@@hu-A {\def\magyar@opt@@labelenums{2}} +\dMf magyar@opt@labelenums@@hu-d {\def\magyar@opt@@labelenums{3}} +\let\magyar@opt@labelenums\magyar@enumarg +\def\magyar@opt@labelitems@@unchanged{\def\magyar@opt@@labelitems{0}} +\def\magyar@opt@labelitems@@hu {\def\magyar@opt@@labelitems{1}} +\let\magyar@opt@labelitems\magyar@enumarg +\def\magyar@opt@openqq@@unchanged{\def\magyar@opt@@openqq{0}} +\def\magyar@opt@openqq@@up{\def\magyar@opt@@openqq{1}} +\def\magyar@opt@openqq@@down{\def\magyar@opt@@openqq{2}} +\def\magyar@opt@openqq@@maybedown{\def\magyar@opt@@openqq{3}} +\let\magyar@opt@openqq\magyar@enumarg +\def\magyar@opt@frenchspacing@@unchanged{\def\magyar@opt@@frenchspacing{0}}% same as =no +\def\magyar@opt@frenchspacing@@no {\def\magyar@opt@@frenchspacing{1}} +\def\magyar@opt@frenchspacing@@yes{\def\magyar@opt@@frenchspacing{2}} +\let\magyar@opt@frenchspacing\magyar@enumarg +\dMf magyar@opt@afterindent@@force-no {\def\magyar@opt@@afterindent{0}} +\dMf magyar@opt@afterindent@@force-yes {\def\magyar@opt@@afterindent{1}} +\dMf magyar@opt@afterindent@@unchanged {\def\magyar@opt@@afterindent{9}} +\let\magyar@opt@afterindent\magyar@enumarg +\def\magyar@opt@postpara#1#2{% + \def\reserved@a{#2}% + \ifx#2\magyar@@unchanged + \let\magyar@opt@@paragraphs\@undefined + \else + \expandafter\def\csname magyar@opt@@#1\endcsname{#2}% + \let\magyar@opt@@paragraphs\@empty + \fi +} +\let\magyar@opt@postsubpara\magyar@opt@postpara +\let\magyar@opt@postdescription\magyar@opt@postpara + +% --- Option processing code of \magyarOptions +% +% Example: \def\magyarOptions{titles=\quad,active=safe} \usepackage[magyar]{babel} +% Dat: Babel has \languageoptions, but it is quite weak and it's too late +% Dat: this is a complete rewrite based on examplep.sty + +%** @param #1 to gobble a space token +%** @usage \magyar@doopt foo=bar,foo2=bar2,\hfuzz,% +\def\magyar@doopt#1,{% + \if,\noexpand#1,% ignore multiple commas (#1 is empty) + \expandafter\magyar@doopt + \else + \csname fi\endcsname% don't count as `\fi' when being skipped + \magyar@doopt@low#1,=,% + \fi +} +\@gobble\iftrue% \def\magyar@doopt@low contains `\fi'. Make it skippable. +\def\magyar@applyopt#1#2{\csname magyar@opt@#1\endcsname{#1}{#2}}% +%** @param #1 is here for gobbling space tokens +\def\magyar@doopt@low#1#2=#3,#4\fi{% + % Dat: Normal case: #1#2 is key, #3 is value, #4 is `=,' + % Dat: MissingArg case: #1#2 is `key,', #3 is empty, #4 is empty + % Dat: Terminator case: #1#2 is `\hfuzz,', #3 is empty, #4 is empty + % Dat: OnlySpace case: #1 is `,', #2 is empty, #3 is empty, #4 is empty + \ifx\relax#4\relax% MissingArg or Terminator + \ifx#1\hfuzz% Terminator + \else + \if,\noexpand#1\else% OnlySpace case + \if=\noexpand#1\magyar@doopt@missingkey#2% #2 already contains comma at end + \else \magyar@doopt@missingval#1#2\fi + \fi + \expandafter\expandafter\expandafter\magyar@doopt + \fi + \else% Normal + \expandafter\ifx\csname magyar@opt@#1#2\endcsname\relax + \@@magyar@error{Unknown option: #1#2 (= #3)}% + \else + \magyar@applyopt{#1#2}{#3}% + \fi + \expandafter\magyar@doopt + \fi +} +\def\magyar@doopt@missingkey#1,{% + \@@magyar@error{Key missing for value: #1}% +} +\def\magyar@doopt@missingval#1,{% + \@@magyar@error{Value (=) missing for option: #1}% +} +%** Dat: Spaces and newlines at end of #1 are not ignored, so please prefix +%** them with a comma, e.g \magyar@doopts{foo=bar, } +%** @param #1 comma-separated optoinname=value pairs +%\def\magyar@doopts#1{\magyar@doopt #1,\hfuzz,}% + +\def\magyar@dooptions{% + \expandafter\ifx\csname opt@\CurrentOption.ldf.sty\endcsname\relax\else + % Usage: \PassOptionsToPackage{foo=bar}{magyar.ldf} + \expandafter\expandafter\expandafter + \magyar@doopt\csname opt@\CurrentOption.ldf.sty\endcsname,\hfuzz,% + \expandafter\let\csname opt@\CurrentOption.ldf.sty\endcsname\relax + \fi + \expandafter\ifx\csname \CurrentOption Options\endcsname\relax\else% \magyarOptions + \expandafter\expandafter\expandafter + \magyar@doopt\csname\CurrentOption Options\endcsname,\hfuzz,% + \expandafter\let\csname \CurrentOption Options\endcsname\relax + \fi +} +\def\magyar@do@option@low#1#2=#3=,\vfuzz{% + \ifx#1\hfuzz\else + %%\typeout{(#1#2)=(#3)}% + % vvv wastes some heap (\csname), but never mind + \fi +} + + +\magyar@opt@defaults{defaults}{over-1.4} % defaults=over-1.4 by default +\def\magyar@opt@@hdrtitleskip{\enskip}% !! option for that +\magyar@dooptions% in \magyarOptions +\ifnum\magyar@opt@@openqq=3 % =maybedown + \ifnum\magyar@opt@@active=0 + \def\magyar@opt@@openqq{0}% =unchanged + \else + \def\magyar@opt@@openqq{2}% =down + \fi +\fi +\ifnum\magyar@opt@@partnumber >0 \let\magyar@needopt@hunumbers\@empty \fi +\ifnum\magyar@opt@@chapternumber>0 \let\magyar@needopt@hunumbers\@empty \fi +\expandafter\ifx\csname magyar@needopt@hunumbers\endcsname\relax\else + \ifnum\magyar@opt@@hunumbers=0 + \@@magyar@error{(chapter|part)number=... needs hunumbers=yes}% + \magyar@opt@@hunumbers1 + \fi + \def\magyar@hunumbers@noclassmod{% + \@@magyar@error{unsupported \string\documentclass,\MessageBreak + hunumbers=yes,chapternumber=...,partnumber=... disabled}% + }% + % This may get redefined to \@empty later. + \def\magyar@hunumbers@errmsg{\magyar@hunumbers@noclassmod}% + \AtBeginDocument\magyar@hunumbers@errmsg +\fi +\if0\magyar@opt@@shorthandcs\else + \if\magyar@opt@@active0% + \@@magyar@error{active=none implies shorthandcs=none}% + \magyar@opt@@active2 % active=safe + \fi +\fi +% Imp: undef \magyar\@opt@* to save memory + +\@gobble\iftrue +%** Usage: `\if...\else\@@magyar@skiplong\fi ... \@gobble{^}', where {^} is in +%** its own line +\def\@@magyar@skiplong#1{% + \fi + %\typeout{--skipfrom:\the\inputlineno} + \bgroup% so ^} would close it + \catcode\string`^13 \lccode\string`~=\string`^ + \lowercase{\let~\fi}% \lowercase because catcode of ^ in \let^ would have been already assigned + %\lowercase{\def~{\typeout{--skipto:\inputlineno}\fi}}% + \catcode\string`\\14 % comment -- avoid using hash memory + \catcode\string`$14 % %$ + \iffalse +} +\@gobble\fi + +\@namedef{extras\CurrentOption}{}% + +% --- hyphenation= + +\csname magyar@opt@@hypr\endcsname +\let\magyar@sugg@pa\@gobble +%\show\magyar@opt@@hyphenation +\ifx\magyar@opt@@hyphenation\@empty + % Hungarian words won't be hyphenated automatically + \expandafter\chardef\csname l@\CurrentOption\endcsname255 + \@@magyar@skiplong\fi +% Define a warning, will be printed later. +\def\@@magyar@suggpa@req@def{% + \def\magyar@sugg@pa##1{% + \PackageWarningNoLine{##1.ldf}{% + Requested Hungarian hyphenation= patterns missing.\MessageBreak + To make LaTeX hyphenate Hungarian words, please\MessageBreak + modify language.dat and rerun initex or texconfig}}}% +% Define a warning, will be printed later. +\def\@@magyar@suggpa@all@def{% + \def\magyar@sugg@pa##1{% + \PackageWarningNoLine{##1.ldf}{% + All Hungarian hyphenation= patterns missing.\MessageBreak + To make LaTeX hyphenate Hungarian words, please\MessageBreak + modify language.dat and rerun initex or texconfig}}}% +\def\@@magyar@hyphenation@last#1\@@magyar@hyphenation@next#2\hfuzz{#1}% +\def\@@magyar@hyphenation@defcs#1#2{\ifx#1#2\else\chardef#1#2\fi}% Dat: \chardef\foo\foo doesn't work +\def\@@magyar@hyphenation@def#1{% + \expandafter\ifx\csname l@#1\endcsname\relax\else + \expandafter\expandafter\expandafter\@@magyar@hyphenation@defcs + \expandafter\expandafter\csname l@\CurrentOption\endcsname + \csname l@#1\endcsname + \@@magyar@hyphenation@last\fi}% +\def\@@magyar@hyphenation@next#1{% + \ifx#1\hfuzz + \else\if#1N% none + % Turn of hyphenation. + \expandafter\chardef\csname l@\CurrentOption\endcsname255 + \@@magyar@hyphenation@last + \else\if#1C% use l@\CurrentOption if defined + \expandafter\ifx\csname l@\CurrentOption\endcsname\relax\else + \@@magyar@hyphenation@last + \fi + \else\if#1w% print the all-missing-warning + \@@magyar@suggpa@all@def + \else\if#1r% print the req-missing-warning + \@@magyar@suggpa@req@def + \else\if#1h\@@magyar@hyphenation@def{hungarian}% + \else\if#1m\@@magyar@hyphenation@def{magyar}% + \else\if#13\@@magyar@hyphenation@def{magyar3}% + \else\if#1c\@@magyar@hyphenation@def{magyarc}% + \else\if#1f\@@magyar@hyphenation@def{magyarf}% + \else\if#1n\@@magyar@hyphenation@def{magyarn}% + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\@@magyar@hyphenation@next + % Dat: no \adddialect\l@magyar... - it's only a chardef +}% + +%\tracingmacros1 \show\magyar@opt@@hyphenation +\expandafter\@@magyar@hyphenation@next\magyar@opt@@hyphenation\hfuzz +%\show\l@magyar +%\tracingmacros0 +\expandafter\ifx\csname l@\CurrentOption\endcsname\relax + \expandafter\newcount\csname l@\CurrentOption\endcsname + % ^^^ BUGFIX at Tue Oct 12 14:13:54 CEST 2004 +\fi +\let\@@magyar@suggpa@all@def\@undefined +\let\@@magyar@suggpa@req@def\@undefined +\@gobble +{^} + +% --- accents= + +\ifx\magyar@opt@@umlaut\@empty\else% !! test this + % Dat: this only affects \" + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\"\umlautlow \magyar@opt@@umlaut} +\fi + +% --- theorem title number ordering and the dot; theoremtitle= +% +% Dat: \ref{mytheorem} never appends a dot +% +% If you want to define your own theorem style without using theorem.sty or +% ntheorem.sty, then do a +% \PassOptionsToPackage{theoremtitle=unchanged}{magyar.ldf} , and then +% define a custom \@begintheorem, \@opargbegintheorem and \@endtheorem. + +\if0\magyar@opt@@theoremtitle \@@magyar@skiplong\fi +% for theorem.sty and ntheorem.sty +% Define your \newtheorem commands in the preamble, before \theoremstyle +\def\magyar@th@magyar{% + \def\@begintheorem##1##2{% + \item[\hskip \labelsep{\theorem@headerfont ##2.\ ##1.}]}% + \def\@opargbegintheorem##1##2##3{% + \item[\hskip \labelsep{\theorem@headerfont ##2.\ ##1\ (##3).}]}% +} + +% vvv Dat: theorem.sty needs \th@magyar-plain when \theoremstyle{...} +% is called, so we have to define it early (even if theorem.sty is not +% loaded). +\expandafter\let\csname th@\CurrentOption-plain\endcsname\magyar@th@magyar% Dat: moved to earlier +% !! now \usepackage{theorem} +% \usepackage[magyar]{babel} +% \theoremstyle{magyar-plain}% % Dat: must be put before \new +% \newtheorem{Def}{Defin\'{i}ci\'o} + +%** @param #1 magyar +\def\@@magyar@setup@theoremstyle#1{% + \expandafter\ifx\csname theorem@headerfont\endcsname\relax + \let\magyar@th@magyar\@undefined + \else + %\expandafter\let\csname th@#1-plain\endcsname\magyar@th@magyar% Dat: moved to earlier + % vvv Dat: activate the Hungarian theorem style by default. + \def\theorem@headerfont{\bf}% + \edef\reserved@a{\the\theorem@style}% + \def\reserved@b{plain}% + \ifx\reserved@a\reserved@b + \expandafter\theorem@style\expandafter{#1-plain}% + \fi + \fi +} + +% Do this quite late in case theorem.sty or ntheorem.sty is loaded late. +\expandafter\AtBeginDocument\expandafter{\expandafter + \@@magyar@setup@theoremstyle\expandafter{\CurrentOption}} + +\expandafter\addto\csname extras\CurrentOption\endcsname{% + %%\show\theorem@headerfont + \expandafter\ifx\csname thm@swap\endcsname\relax + \expandafter\ifx\csname theorem@headerfont\endcsname\relax% no theorem.sty + \babel@save\@begintheorem + % Dat: amsart.cls: \def\@begintheorem#1#2[#3]{}% + \def\@begintheorem#1#2{\trivlist + \item[\hskip \labelsep{\bfseries #2.\ #1.}]\itshape}% old: \slshape + \babel@save\@opargbegintheorem + \def\@opargbegintheorem#1#2#3{\trivlist + \item[\hskip \labelsep{\bfseries #2.\ #1\ (#3).}]\itshape}% old: \slshape + \else% theorem.sty or ntheorem.sty + % Nothing -- style already set up in the preamble. + \fi + \else% amsthm.sty + \babel@save\thmhead + \babel@save\swappedhead + %** \swapnumbers. \newtheorem{...}{...} already inserts the trailing dot + % \def\thm@swap{S}% no effect :-( + %** overrides amsart.cls + \def\thmhead#1#2#3{% + \thmnumber{\@upn{#2}\@ifnotempty{#1}{.~}}% + \thmname{#1}% + \thmnote{ {\the\thm@notefont(#3)}}% + }% + \let\swappedhead\thmhead + \fi +}% +\@gobble +{^}% + +% --- Quotation marks with \textqq +% +% Symbols of Hungarian quoting: unquoted ,,outer >>middle 'inner'<<'' +% Equivalent: unquoted \quotedblbase outer \guillemotright middle +% \textquoteright inner\textquoteright\guillemotleft\textquotedblright +% With magyar.ldf: unquoted \textqq{outer \textqq{middle \textqq{inner}}} +% Typing this with magyar.ldf works for outer: \textqq{foo} +% Typing this works with T1 and OT1 for outer: \glqq foo'' +% Typing this works in T1, but not in OT1 for outer: ,,foo'' +% + +\if0\magyar@opt@@textqq \@@magyar@skiplong\fi +\def\magyar@textqq@level{0} +%** Provide a placeholder for language-unspecific \textqq +\def\@@magyar@textqq@nolang#1{% + \ifcase\magyar@textqq@level + \def\magyar@textqq@level{1}% + \textquotedblleft#1\textquotedblright + \def\magyar@textqq@level{0}% + \or + \textquoteleft#1\textquoteright + \fi +} +\def\@@magyar@textqq@hu#1{\ifmmode\expandafter\mbox\fi{% + % Imp: \textqq{\textqq{foo}} -> \textqq{\textqq{foo}\,} + % Dat: \showhyphens{\textqq{hello bello}} --> hel-lo bel-lo + % Dat: \guillemotleft is provided by babel.def even for the OT1 encoding + \ifcase\magyar@textqq@level + \def\magyar@textqq@level{1}% + % Dat: \hskip instead of \kern to allow hyphenation + % \nobreak\hskip-.06em adds a non-breakable skip and allows hyphenation + % of the following word. + \quotedblbase\nobreak\hskip-.06em\relax#1\kern\z@\textquotedblright% skip OK for the CM and EC fonts + \def\magyar@textqq@level{0}% + \or + \def\magyar@textqq@level{2}% + \guillemotright\nobreak\hskip-.07em\relax#1\kern-0.05em\guillemotleft% skip OK for CM and EC fonts + \def\magyar@textqq@level{1}% + \or + \def\magyar@textqq@level{3}% + \textquoteright\nobreak\hskip\z@\relax#1\kern\z@\textquoteright + \def\magyar@textqq@level{2}% + \else + \quotedblbase\nobreak\hskip-.06em\relax#1\kern\z@\textquotedblright% skip OK for the CM and EC fonts + \fi +}}% + +\catcode`\ =11\relax% make space a letter +\ifnum\magyar@opt@@textqq\expandafter\ifx\csname\@gobble.textqq\endcsname\relax1\fi>1\relax% 21, 2, 11, 1 +\def\textqq{\protect\textqq }% \MakeRobust +\def\@@magyar@textqq{\protect\textqq }% +\let\textqq \@@magyar@textqq@nolang% +\expandafter\addto\csname\@gobble.extras\CurrentOption\endcsname% +{\babel@save\textqq \let\textqq \@@magyar@textqq@hu}% +\else% +\def\@@magyar@textqq{\protect\@@magyar@textqq }% \MakeRobust +\let\@@magyar@textqq \@@magyar@textqq@nolang% +\expandafter\addto\csname\@gobble.extras\CurrentOption\endcsname% +{\babel@save\@@magyar@textqq \let\@@magyar@textqq \@@magyar@textqq@hu}% +\fi% +\catcode`\ =10\relax% back to space again +\@gobble +{^}% + +% --- Definite articles (\az, \pageref -> \apageref etc.) + +\if0\magyar@opt@@az \@@magyar@skiplong\fi + +\makeatletter + +%** modified by pts at Fri Oct 3 22:19:13 CEST 2003 +%** @param #1 tokens, will be \edef\vfuzz'ed +\def\@@magyar@az@vfuzzedef#1{% + \begingroup + \@safe@activestrue% allow active `:' inside labels; + \def\hyper@@link[##1]##2##3##4{##4}% Dat: \def\b@abook{\hyper@@link [cite]{}{cite.sokt}{2}}% with hyperref.sty + \let\romannumeral\number% by pts@fazekas.hu at Mon Oct 27 23:44:06 CET 2003 + % Dat: deliberately no \autoref for hyperref.sty !! (why??) + \let\ref\@@magyar@zeroref \let\pageref\@@magyar@zeropageref + \let\cite\@@magyar@zerocite \let\eqref\@@magyar@zeroeqref + % ^^^ fix so \az{\ref{...}} works + \let\refstruc\@@magyar@zerorefplus + \let\refstrucparen\@@magyar@zerorefplus + \def\setbox ##1{}% to get rid of accents and special letters + \def\hbox ##1{}% + \def\accent ##1 ##2{##2}% + \def\add@accent ##1##2{##2}% + \def\@text@composite@x ##1##2{##2}% + \def\i{i}\def\j{j}% + \def\ae{a}\def\AE{A}\def\oe{o}\def\OE{O}% + \def\ss{s}\def\L{L}% + \def\d{}\def\b{}\def\c{}\def\t{}% Dat: no need to redefine \H and \. + % Dat: no need to remove \textsf or \mdseries, because they are + % handled properly by \protect == \string here. + \let\@safe@activestrue\@empty% babel puts these inside \b@...: % Dat: \def\b@abook{\@safe@activesfalse 2}% (what is \@safe@actives??) + \let\@safe@activesfalse\@empty + \edef\vfuzz{\noexpand\def\noexpand\vfuzz{#1}}% + \expandafter\endgroup\vfuzz +} + +%** Makes \az etc. not emit the definite article. +%** Unused. +\def\@@magyar@noaz{% + \def\@@magyar@az@lowt{\@ifstar\@gobble\@firstofone}% + \def\az{\@@magyar@az@lowt}% + \let\Az\az + \def\aref{\@ifstar\@gobble\@@magyar@az@lowa}% + \let\Aref\aref + \def\apageref{\@ifstar\@gobble\firstoftwo}% + \let\Apageref\apageref + \def\acite{\@ifstar\@gobble\cite}% + \let\Acite\acite +} + +%** Usage: \az{alma} -> `az alma'; \Az*{alma} -> `az' +%** Usage: \az+\ref{foo} is equivalent to \az{\ref{foo}} +\def\@@magyar@az@lowt{\@ifstar{\@@magyar@az@lowy}{\@ifnextchar+\@@magyar@az@lowz\@@magyar@az@lowx}} +\def\@@magyar@az@lowz#1#2#3{\@@magyar@az@lowy{#2{#3}}~#2{#3}} +%** Used by new varioref.sty +\def\@@magyar@az@lowxu{\unskip\@@magyar@az@lowx}% +\def\@@magyar@az@lowx#1{\@@magyar@az@lowy{#1}~#1} +\def\@@magyar@az@lowy#1{{% + \begingroup + %\def\protect{\noexpand\protect\noexpand}% + \set@display@protect% screws up \r + \@@magyar@az@vfuzzedef{#1}% + %%\show\vfuzz + \expandafter\endgroup\expandafter + \set@display@protect\expandafter% fixes \r; why?? + \@@magyar@az@set\expandafter{\vfuzz}\hbox$% +}} + +\def\@@magyar@firstarg#1#2\hbox${#1}% + +%** \Aref({e:foo}) -> `az~(5)'; \aref*{e:foo}: `az' +\def\@@magyar@az@lowa{\@ifnextchar({\@@magyar@az@lowb}{\@@magyar@az@lowb\@empty}} +\def\@@magyar@az@lowb#1#2{\@@magyar@az@ref\@firstoftwo{#2}~#1\ref{#2}} +%** @param #1 \@firstoftwo (for \ref) or \@secondoftwo (for \pageref) +%** everything which is not \@secondoftwo is treated is \@firstoftwo +%** @param #2 for \csname r@#2\endcsname +\def\@@magyar@az@ref#1#2{% + \begingroup + % Dat: this works when turning on hyperref.sty for the 1st time (1st .aux file) -- but the original \ref doesn't work (\@fifthoffive) + % Dat: #2 might contain an active : ; ! ? in case + % \def\magyarOptions{activespace=safe} + \begingroup\lccode`~`: \lowercase{\endgroup\edef~{\string~}}% + \begingroup\lccode`~`; \lowercase{\endgroup\edef~{\string~}}% + \begingroup\lccode`~`! \lowercase{\endgroup\edef~{\string~}}% + \begingroup\lccode`~`? \lowercase{\endgroup\edef~{\string~}}% + \@ifundefined{@@magyar@r@#2}{% + \@ifundefined{r@#2}{\let\reserved@a\@empty}{\expandafter\let\expandafter\reserved@a\csname r@#2\endcsname}% + }{\expandafter\let\expandafter\reserved@a\csname @@magyar@r@#2\endcsname}% + \ifx\reserved@a\@empty\endgroup\else% a speed boost + \ifx#1\@secondoftwo\relax % Dat: remove the 1st {...} arg inside \reserved@a + \expandafter\expandafter\expandafter\def\expandafter\expandafter + \expandafter\reserved@a\expandafter\expandafter\expandafter{% + \expandafter\expandafter\expandafter\@gobble\reserved@a{}}% + \fi + % vvv keep only the 1st arg (w/o braces) of \vbox, without expansion. + % This is to have hyperref.sty with `\newlabel{tab}{{1}{2}{\texorpdfstring {\textit {bg}}{asd}\relax }{section.1}{}}' + % right, and \texorpdfstring not expanded in the \edef below. + \expandafter\expandafter\expandafter\def\expandafter\expandafter + \expandafter\reserved@a\expandafter\expandafter\expandafter{% + \expandafter\expandafter\expandafter\@@magyar@firstarg\reserved@a{}\hbox$}% + \expandafter\@@magyar@az@vfuzzedef\expandafter{\reserved@a}% + \expandafter\endgroup\expandafter\@@magyar@az@set\expandafter{\vfuzz}\hbox$% + \fi +} + +\def\@@magyar@az@lowd#1{\@@magyar@az@ref\@secondoftwo{#1}~\pageref{#1}} + +\def\@@magyar@acite@lowb{\@ifnextchar [{\@@magyar@acite@lowa}{\@@magyar@acite@lowa[]}} +\def\@@magyar@acite@lowa[#1]#2{% + \@@magyar@acite@lowd{#2}~% + \ifx\vfuzz#1\vfuzz\cite{#2}\else\cite[#1]{#2}\fi +} +\def\@@magyar@acite@lowd#1{\@@magyar@acite@lowc#1,\hbox$} +\def\@@magyar@acite@lowc#1,#2\hbox#3${% + \begingroup + \@ifundefined{@@magyar@b@#1}{% + \@ifundefined{b@#1}{\def\vfuzz{}}{% + \@@magyar@az@vfuzzedef{% + \expandafter\expandafter\expandafter\@@magyar@b@number + \expandafter\expandafter\expandafter{\csname b@#1\endcsname}}}% + } {\@@magyar@az@vfuzzedef{\csname @@magyar@b@#1\endcsname}}% + \expandafter\endgroup\expandafter + \@@magyar@az@set\expandafter{\vfuzz}\hbox$% +} + +% The original version of the \@az macros below were written by +% David Carlisle, but they have been completely rewritten by pts. + +%** Adds definite article for a word #1#2#3 if #1 is in [A..Z]. Spaces +%** between #1, #2 and #3 can be -- fortunately -- ignored. +%** This is used to distinguish single-letter labels from text labels. +%** Dat: by pts: `\Az{Sz} bet' emits `Az Sz bet'; `\az{szlam}' is also OK +%** @param #1#2#3 doesn't contain \hbox (but may contain space) +%** @param #1 #2 #3 never lower case +\def\@@magyar@azuc#1#2#3{% + \if\noexpand#1Az% + \else\if\noexpand#1Ez% + \else\if\noexpand#1F\ifnum11=\the\catcode\string`#2\else z\fi + \else\if\noexpand#1Iz% + \else\if\noexpand#1L\ifnum11=\the\catcode\if\noexpand#2Y\string`#3\else\string`#2\fi\else z\fi + \else\if\noexpand#1M\ifnum11=\the\catcode\string`#2\else z\fi + \else\if\noexpand#1N\ifnum11=\the\catcode\if\noexpand#2Y\string`#3\else\string`#2\fi\else z\fi + \else\if\noexpand#1Oz% + \else\if\noexpand#1S\ifnum11=\the\catcode\if\noexpand#2Z\string`#3\else\string`#2\fi\else z\fi + \else\if\noexpand#1R\ifnum11=\the\catcode\string`#2\else z\fi + \else\if\noexpand#1Uz% + \else\if\noexpand#1X\ifnum11=\the\catcode\string`#2\else z\fi + \else\if\noexpand#1Y\ifnum11=\the\catcode\string`#2\else z\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi +} +\def\@@magyar@azuc@pre#1#2#3#4\hbox${% + \uppercase{\@@magyar@azuc#1#2#3}% Dat: we map a..z -> A..Z +} + +%** Also defined elsewhere. +%** @param #2 \else...\else...\fi...\fi etc. +\def\@@magyar@swaprelax#1#2\relax{#2#1} +\def\@@magyar@ignorehbox@pre#1\hbox${}% +%** Counts the number of digits until a nondigit is found, and insert `z' if +%** appropriate (divisible by 3). +%** We need this to properly handle \aref for eg. 1.3.12 (subsec number) +%** or 3-45 (pagenumber preceeded by chapter number). +\def\@@magyar@eatddd#1#2#3#4{% + % Wizardry: \@@magyar@eatddd throws away #1 (\@@magyar@ignorehbox@pre) + \ifnum9<1\string#2 \ifnum9<1\string#3 \ifnum9<1\string#4 % test for digits + \@@magyar@swaprelax\@@magyar@eatddd\fi\fi\else z\fi + \relax\@@magyar@ignorehbox@pre +} + +% vvv Wizardry: ignore everything (second number?) after first space +\def\@@magyar@eatddd@pre#1 #2\hbox${\@@magyar@eatddd.#1[][]\hbox$}% + +\@gobble\iftrue +\def\@@magyar@azrb@stop#1#2\fi{#1}% +%** Strips spaces and braces automatically +%** @expands to `z' or nothing (last char of definite article) +%** @example \message{R:\removebraces {{foo}{{}{b}{{{{a\fi}}}}r}}\hfuzz;} +\def\@@magyar@azrb#1{% + \ifx\hfuzz#1\@@magyar@azrb@stop\fi + \expandafter\@@magyar@azrb\expandafter{% + \ifcat{\noexpand#1\hfuzz\iffalse}\fi\expandafter + \@@magyar@azrb\else\hfuzz}\@@magyar@azrb@nob{#1}\fi} +\def\@@magyar@azrb@nob#1#2{#2% #2 is \fi + \ifx\hfuzz#1\hfuzz\expandafter\@firstoftwo + \expandafter\@@magyar@azrb\fi\@@magyar@azrb@nobone#1} +\def\@@magyar@azrb@nobone#1{\noexpand#1\@@magyar@azrb}% + +\def\@@magyar@aznospace#1{% + \if\hfuzz\noexpand#1\expandafter\@@magyar@aznospace\else % a \cs, ignored -- may be \relax + \expandafter\@@magyar@aznospace@short\expandafter#1% + \fi +} + +%** @param #1 might not be \cs -- and isn't empty +\def\@@magyar@aznospace@short#1{% + \if5\noexpand#1z% Dat: emit `az 5' + \@@magyar@swaprelax\@@magyar@ignorehbox@pre + \else\if1\noexpand#1% + % Dat: properly handle `az 1001 jszaka', `az 1234567 ves bolyg' + \@@magyar@swaprelax\@@magyar@eatddd@pre + \else\ifnum1<1\noexpand#1 % a different digit, emit `a ' + \@@magyar@swaprelax\@@magyar@ignorehbox@pre + \else\if-\noexpand#1% \az{-5} yields `a~-5' + \@@magyar@swaprelax\@@magyar@ignorehbox@pre + \else\ifcat\string*\noexpand#1% ignore non-digit (non-letter) `other' char + % Wizardary: (undocumented) + % This is a really smart way to ignore control sequence chars resulting + % from \string\textrm etc. Fortunately, most control sequences don't + % contain digits. + \@@magyar@swaprelax\@@magyar@aznospace + \else + \@@magyar@swaprelax{\@@magyar@azuc@pre#1}% safe to call, no \cs + \fi\fi\fi\fi\fi\relax +} + +%** Typesets `z' or nothing (last char of definite article). Is _not_ +%** expandable. +%** @param #1 may contain space(_10) tokens, but mustn't contain expandable +%** tokens. +\def\@@magyar@az@set#1#2\hbox${% by pts + % ^^^ Dat: we have `$' instead of `!' because of catcode changes (shouldn't affect) + \edef\reserved@a{\@@magyar@azrb#1\hfuzz}% + \expandafter\@@magyar@aznospace\reserved@a[b][][] \hbox$% + % ^^^ Wizardry: [b][][] is a smart sentinel for \@@magyar@azuc and `b' for + % \@@magyar@aznospace@short. First `[' is there for aesthetics. Space + % is there for \@@magyar@eatddd@pre. \hbox$ is something that will not + % occur in normal text. +} + +\ifnum\magyar@opt@@az \expandafter\ifx\csname az\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \DeclareRobustCommand\az{a\@@magyar@az@lowt}\fi +\ifnum\magyar@opt@@az \expandafter\ifx\csname Az\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \DeclareRobustCommand\Az{A\@@magyar@az@lowt}\fi +\ifnum\magyar@opt@@az \expandafter\ifx\csname aref\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \DeclareRobustCommand\aref{a\@ifstar{\@@magyar@az@ref\@firstoftwo}{\@@magyar@az@lowa}}\fi +\ifnum\magyar@opt@@az \expandafter\ifx\csname Aref\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \DeclareRobustCommand\Aref{A\@ifstar{\@@magyar@az@ref\@firstoftwo}{\@@magyar@az@lowa}}\fi +\ifnum\magyar@opt@@az \expandafter\ifx\csname apageref\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \DeclareRobustCommand\apageref{a\@ifstar{\@@magyar@az@ref\@secondoftwo}{\@@magyar@az@lowd}}\fi +\ifnum\magyar@opt@@az \expandafter\ifx\csname Apageref\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \DeclareRobustCommand\Apageref{A\@ifstar{\@@magyar@az@ref\@secondoftwo}{\@@magyar@az@lowd}}\fi +\ifnum\magyar@opt@@az \expandafter\ifx\csname acite\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \DeclareRobustCommand\acite{a\@ifstar{\@@magyar@acite@lowd}{\@@magyar@acite@lowb}}\fi +\ifnum\magyar@opt@@az \expandafter\ifx\csname Acite\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \DeclareRobustCommand\Acite{A\@ifstar{\@@magyar@acite@lowd}{\@@magyar@acite@lowb}}\fi + +\@gobble +{^} + +% --- hunnewlabel= + +\if0\magyar@opt@@hunnewlabel + \let\hunnewlabel\@gobbletwo + % ^^^ with this the user would be able to switch from hunnewlabel=yes + % to hunnewlabel=no without removing the .aux file. But now I have a + % better solution to that. (??) !! + \@@magyar@skiplong\fi + +% [pts] Done properly by pts@fazekas.hu at Mon Mar 2 21:53:30 CET 2009 +% +% \label will be redefined to write another line to .aux file: +% \hunnewlabel{...}{...}: similar to \newlabel{sectionStructNr}{pageNr}, +% where the roman numerals are replaced by their arabic representations, so +% \aref and \apageref will work (`a II. rsz'). The name \hunnewlabel is a +% legacy. +% +% We have to redefine \refstepcounter, which defines \@currentlabel, so we +% can define \magyar@@currentlabel@arabic, wich is the same as \@currentlabel, +% but it contains the number in arabic instead of roman. Without +% \magyar@@currentlabel@arabic, \label would have no clue that a roman number +% was involved. hyperref.sty also redefines \refstepcounter, but we are +% agnostic to that: it doesn't matter if we are first. + +\let\magyar@@orig@refstepcounter\refstepcounter +% \relax, or {currentlabel}{pagenumber} +\let\magyar@@currentlabel@intact\relax +% \relax, or {currentlabel-in-arabic}{pagenumber-in-arabic} +\let\magyar@@currentlabel@arabic\relax + +\def\@@magyar@setup@romantoarabic{% + \let\romannumeral\number + \let\@Roman\@roman % avoid uppercasing +} + +\def\refstepcounter#1{% + \magyar@@orig@refstepcounter{#1}% + \begingroup + % Imp: wait till \shipout before expanding \thepage, in case of + % \pagenumbering{roman}. + % \c@page might be wrong (it's correcy at \shipout only), se we fake it. + \c@page\@m + \edef\reserved@b{{\thepage}}% + \let\reserved@a\@currentlabel + % Wrap \reserved@a in {...}, and then append \reserved@b to \reserved@a. + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter\reserved@a% + \expandafter\expandafter\expandafter{% + \expandafter\expandafter\expandafter{% + \expandafter\reserved@a\expandafter}\reserved@b}% + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter\def\expandafter\magyar@@currentlabel@intact\expandafter{% + \reserved@a}}% + \expandafter\endgroup\reserved@b + \begingroup + \c@page\@m + \@@magyar@setup@romantoarabic + % This \protected@edef is from the \refstepcounter code. + \protected@edef\reserved@a{% + {\csname p@#1\endcsname\csname the#1\endcsname}{\thepage}}% + \let\reserved@b\@empty + \ifx\reserved@a\@currentlabel\else + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter\def\expandafter\magyar@@currentlabel@arabic\expandafter{% + \reserved@a}}% + \fi + \expandafter\endgroup\reserved@b +} + +%** Make its expansion short so \ifx would be fast down in noextras... +\def\@@magyar@labela{\@@magyar@labelb}% +\def\@@magyar@labelb#1{% + \@@magyar@orig@label{#1}% output \newlabel to \@auxout + \begingroup + \c@page\@m + \edef\reserved@b{{\thepage}}% + \let\reserved@a\@currentlabel + % Wrap \reserved@a in {...}, and then append \reserved@b to \reserved@a. + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter\reserved@a% + \expandafter\expandafter\expandafter{% + \expandafter\expandafter\expandafter{% + \expandafter\reserved@a\expandafter}\reserved@b}% + \ifx\reserved@a\magyar@@currentlabel@intact + % \@currentlabel created by our overridden \refstepcounter. + \ifx\magyar@@currentlabel@arabic\magyar@@currentlabel@intact\else + \expandafter\@@magyar@labelc\magyar@@currentlabel@arabic{#1}% + \fi + \else + % \@currentlabel from unknown origin. + % Emit \hunnewlabel if \thepage is roman. + \@@magyar@setup@romantoarabic + \edef\reserved@c{{\thepage}}% + \ifx\reserved@b\reserved@c\else % \thepage is roman + \@@magyar@labelc\@currentlabel{}{#1}% + \fi + \fi + \endgroup +} +% @param #1 \@currentlabel (maybe expanded) as roman converted to arabic +% @param #2 any page number in any format; ignored +% @param #3 name of the label +\def\@@magyar@labelc#1#2#3{% + % We have \noexpand\number below to prevent the \edef in \protected@write + % from expanding the page number. It will be expanded at \shipout. + \protected@write\@auxout{}{% + \string\hunnewlabel{#3}{{#1}{\noexpand\number\c@page}}}% +} + +\expandafter\addto\csname extras\CurrentOption\endcsname{% + %%\message{--EXTRAS--}\show\label + \ifx\label\@@magyar@labela\else + \let\@@magyar@orig@label\label + \let\label\@@magyar@labela + \fi +} +\expandafter\addto\csname noextras\CurrentOption\endcsname{% + %%\message{--NO--}% + \ifx\label\@@magyar@labela + % The trick here is not to restore the ``original'' label command if + % somebody has changed it since the previous save in \extrasmagyar. This + % adds compatibility with hyperref.sty, because it loads nameref.sty which + % changes \label after babel.sty and magyar.ldf has been loaded. + % 1. \usepackage[magyar]{babel}% \AtBeginDocument{\select@language{magyar}} + % 2. \usepackage{hyperref}% \AtBeginDocument{\RequirePackage{nameref}} + % 3. \begin{document}: + % 4. \input \jobname.aux + % 5. \AtBeginDocument hooks: + % 6. \select@language{magyar} + % 7. \extrasmagyar + % 8. \let\@@magyar@orig@label\label + % 9. \RequirePackage{nameref}: + % 10. \def\label#1{...} + \if1\magyar@opt@@hunnewlabel % only hunnewlabel=only-hu + \let\label\@@magyar@orig@label + \fi + \fi + % \let\@@magyar@orig@label\relax % Dat: commenting out this makes it possible to load magyar.ldf twice +} +\def\hunnewlabel#1#2{% + \def\reserved@a{#2}% + \expandafter\ifx\csname r@#1\endcsname\reserved@a% hun and normal labels are the same + \relax% \message{No need for def: #1}% + \else + \global\expandafter\let\csname @@magyar@r@#1\endcsname\reserved@a% + \fi +} + +\@gobble +{^} + +% --- captions= + +\if0\magyar@opt@@captions\@@magyar@skiplong\fi +\@namedef{captions\CurrentOption}{% + % Dat: inputenc isn't known, so we just use the safe \'a for accented letters + \def\prefacename{El\H osz\'o}% + \def\refname{Hivatkoz\'asok}% + \def\abstractname{Kivonat}% + \def\bibname{Irodalomjegyz\'ek}% + \def\appendixname{f\"uggel\'ek}% BUGFIX at Sun Feb 29 22:02:51 CET 2004 + \def\contentsname{Tartalomjegyz\'ek}% + \def\listfigurename{\'Abr\'ak jegyz\'eke}% + \def\listtablename{T\'abl\'azatok jegyz\'eke}% + \def\indexname{T\'argymutat\'o}% + \def\enclname{Mell\'eklet}% + \def\ccname{K\"orlev\'el--c\'\i mzettek}% ?? + \def\headtoname{C\'\i mzett}% + \def\proofname{Bizony\'\i t\'as}% AMS-\LaTeX + \def\glossaryname{Sz\'ojegyz\'ek}% glosszrium, (magyarzatos) szjegyzk + % vvv All these are start with a small letter + \def\figurename{\'abra}% + \def\chaptername{fejezet}% + \def\tablename{t\'abl\'azat}% + \def\notesname{Jegyzetek}% endnotes.sty + \def\partname{r\'esz}% + \def\pagename{oldal}% + \def\seename{l\'asd}% + \def\alsoname{l\'asd m\'eg}% +} +\@gobble +{^} + +% --- Changing the order of the table numbers; tablecaptions= + +\if0\magyar@opt@@tablecaptions\@@magyar@skiplong\fi + % Wee need `1. tblzat' instead of `Table 1' + \if1\magyar@opt@@tablecaptions + \def\@@magyar@fnum@table{\thetable.~\tablename}% + \else \def\@@magyar@fnum@table{\tablename\nobreakspace\thetable}\fi + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\fnum@table\let\fnum@table\@@magyar@fnum@table} + \@gobble +{^} + +% --- Changing the order of the figure numbers; figurecaptions= + +\if0\magyar@opt@@figurecaptions\@@magyar@skiplong\fi + \if1\magyar@opt@@figurecaptions + \def\@@magyar@fnum@figure{\thefigure.~\figurename}% + \else \def\@@magyar@fnum@figure{\figurename\nobreakspace\thefigure}\fi + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\fnum@figure\let\fnum@figure\@@magyar@fnum@figure} + \@gobble +{^} + +% --- dottedtocline= + +\if0\magyar@opt@@dottedtocline\@@magyar@skiplong\fi + % Dat: It is quite safe to re-define \@dottedtocline, because it isn't + % redefined in standard packages of teTeX 1. + %** Overrides latex.ltx. Allows the page number extend beyond \@pnumwidth. + \def\@dottedtocline#1#2#3#4#5{% + \ifnum #1>\c@tocdepth \else + \vskip \z@ \@plus.2\p@ + {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip + \parindent #2\relax\@afterindenttrue + \interlinepenalty\@M + \leavevmode + \@tempdima #3\relax + \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip + {#4}\nobreak + \leaders\hbox{\(\m@th + \mkern \@dotsep mu\hbox{.}\mkern \@dotsep + mu\)}\hfill + \nobreak + \setbox\@tempboxa\hbox{\normalfont \normalcolor #5}% ****pts**** + \ifdim\wd\@tempboxa<\@pnumwidth\setbox\@tempboxa\hb@xt@\@pnumwidth{\hfil\unhbox\@tempboxa}\fi + \box\@tempboxa + \par}% + \fi} + \@gobble +{^}% + +% --- amslevelfix= + +% detect ams{ldoc,dtx,art,book,proc}.sty +\ifnum1<0% + \magyar@opt@@amslevelfix + \expandafter\ifx\csname setTrue\endcsname\relax\else 1\fi + \expandafter\ifx\csname allowttyhyphens\endcsname\relax\else 1\fi +\space\else\@@magyar@skiplong\fi + % Fix amsart.cls etc. so no Overfull \hbox occurs in the \listoffigures. + % Changes \@tocline{0}{3pt plus2pt}{0pt}{}{} to \@tocline{0}{3pt plus2pt}{0pt}{\parindent}{} + \def\magyar@amslevelfix#1#2#3#4#5#6#7\vfuzz{% + \def\reserved@a{#6}% + \ifx\@tocline#2\ifx\reserved@a\@empty% + \def#1{\@tocline{#3}{#4}{#5}{\parindent}{}}% + \fi\fi + } + \expandafter\magyar@amslevelfix\expandafter\l@table \l@table ,,,,,,,\vfuzz + \expandafter\magyar@amslevelfix\expandafter\l@figure\l@figure,,,,,,,\vfuzz + \@gobble +{^}% + +% --- amsuppercasefix= + +% Fix for small \'\i in capitalized title (no fix needed for \'i and ): +% \documentlcass{amsart} % amsart.cls +% \usepackage{t1enc} +% \usepackage[latin2]{inputenc} +% \author{author Anal{\'\i}{\'i}zis} +% \title {title Anal{\'\i}{\'i}zis} +% \begin{document} \maketitle a\newpage b\newpage c \end{document} +% This bug is a general amsart.cls bug, not specific to magyar.ldf. +\ifnum1<0% + \magyar@opt@@amsuppercasefix + \expandafter\ifx\csname altucnm\endcsname\relax\else 1\fi +\space\else\@@magyar@skiplong\fi + % textcase.sty is not available by default (Ubuntu 8.04 TeX Live), and + % newer amsart.cls doesn't have this bug (\'\i gets capitalized properly) + \AtEndOfPackage{\IfFileExists{textcase.sty}{\RequirePackage{textcase}}{}} + \@gobble +{^}% + +% --- babelmarkfix= + +% Fix the language name (\foreignlanguage{\languagename}}) appearing in +% \@evenhead. Reason: both amsart.cls and babel.def 3.8 redefine \markboth. +% (There is no problem in Babel 3.7.) +% This bug is a general Babel 3.8 + amsart.cls bug, not specific to +% magyar.ldf. +% +% Dat: amsart.cls redefines \markboth defined in latex.ltx +\ifnum0<0% + \magyar@opt@@babelmarkfix\relax +\space\else\@@magyar@skiplong\fi + \begingroup + %\def\foreignlanguage{\fffffff} % Dat: not called here + % Dat: usually called: \mark{\the\@temptokena} + %\def\mark#1{\showthe\@temptokena{\toks@{B#1}\global\edef\@@magyar@@marktest{\the\toks@}}} + %\def\mark#1{\global\def\@@magyar@@marktest{#1}} + \def\mark#1{\global\edef\@@magyar@@marktest{#1}} + \let\if@nobreak\iffalse \@gobble\fi\@gobble\fi % Dat: \@gobble: make skippable + \def\@@magyar@@marktest@noexp{{\noexpand\@empty BA}{\noexpand\@empty BB}} + \expandafter\org@markboth\@@magyar@@marktest@noexp + % ^^^ Dat: since we call \org@markboth, the result doesn't depend on the Babel + % version, i.e. how Babel redefines \markboth + % ^^^ Dat: call changes \@@magyar@@marktest + % amsart.cls -> {\noexpand \@empty BA}{\noexpand \@empty BB} + % article.cls -> {\@empty BA}{\@empty BB} + \ifx\@@magyar@@marktest\@@magyar@@marktest@noexp + % OK, now test for \markboth, as defined in Babel 3.8 + \def\org@markboth#1#2{\global\def\@@magyar@@marktest{#1..#2}}% + \markboth{CA}{CB}% + % ^^^ Dat: call changes \@@magyar@@marktest + % Babel 3.7 -> \foreignlanguage {magyar}{CA}..\foreignlanguage {magyar}{CB} + % Babel 3.8 -> \noexpand \foreignlanguage {\languagename }{\noexpand \bbl@restore@actives CA}..\noexpand \foreignlanguage {\languagename }{\noexpand \bbl@restore@actives CB} + \def\reserved@a#1#2\hfuzz${#1}% + \expandafter\expandafter\expandafter\ifx + \expandafter\expandafter\expandafter\noexpand + \expandafter\reserved@a\@@magyar@@marktest\relax\hfuzz$% + % Dat: we reach this if \@@magyar@@marktest starts by \noexpand + % Dat: So now we have amsart.cls + \markboth of Babel 3.8. + % The solution is to restore \markboth and \markright of Babel 3.7 + %\let\reserved@a\@empty \zzzzzz + \def\reserved@a{% + \let\markright\org@markright + \bbl@redefine\markright##1{% + \toks@{##1}% + \edef\bbl@tempa{% + \noexpand\org@markright{% + \noexpand\foreignlanguage{\languagename}{\the\toks@}}}% + \bbl@tempa + } + \let\markboth\org@markboth + \bbl@redefine\markboth##1##2{% + \toks@{##1}\toks8{##2}% + \edef\bbl@tempa{% + \noexpand\org@markboth{% + \noexpand\foreignlanguage{\languagename}{\the\toks@}}{% + \noexpand\foreignlanguage{\languagename}{\the\toks8}}}% + \bbl@tempa + }% + }% + \else \let\reserved@a\@empty + \fi + \else \let\reserved@a\empty + \fi + %\show\reserved@a \let\reserved@a\@empty + \global\let\@@magyar@@marktest\@undefined + \global\let\@@magyar@@marktest@noexp\@undefined + \expandafter\endgroup\reserved@a + \@gobble +{^}% + +% --- showfix= +% +% Fix stupid \def\show{...} in AtBeginDocument in ucsencs.def by restoring the original +% definition. + +\ifnum0<0% + \magyar@opt@@showfix\relax +\space\else\@@magyar@skiplong\fi + \def\magyar@stripcolon#1:#2\vfuzz{#2}% + \def\magyar@show@begin@fix{% + \edef\reserved@a{\expandafter\magyar@stripcolon\meaning\show:\vfuzz}% + \ifx\reserved@a\@empty\else % \show is a macro + \let\show\@@magyar@orig@show + \fi + } + \edef\reserved@a{\expandafter\magyar@stripcolon\meaning\show:\vfuzz}% + \ifx\reserved@a\@empty % \show is not a macro + \let\@@magyar@orig@show\show + \expandafter\gdef\expandafter\@preamblecmds\expandafter{% + \expandafter\magyar@show@begin@fix\@preamblecmds}% + %\show\@begindocumenthook + %\AtBeginDocument{\magyar@show@begin@fix}% + \fi + \@gobble +{^}% + +% --- captionfix= +% +% Fix ``1. bra'' order in \caption defined by caption.sty 2004/07/16 v3.0c. +% +% The manual fix would be: +% +% \DeclareCaptionLabelFormat{simpleMagyar}{#2.\bothIfSecond{\nobreakspace}{#1}} +% \let\caption@lfmt\caption@lfmt@simpleMagyar +% + +\if0\magyar@opt@@captionfix\@@magyar@skiplong\fi + \def\@@magyar@captionfix{\@ifundefined{caption@lfmt}{}{% + % Dat: only in preamble: \DeclareCaptionLabelFormat{simpleMagyar}{#2.\bothIfSecond{\nobreakspace}{#1}} + \def\caption@lfmt@simpleMagyar##1##2{##2.\bothIfSecond{\nobreakspace}{##1}}% + }} + \AtBeginDocument{\@@magyar@captionfix} + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \ifx\caption@lfmt\caption@lfmt@default % Imp: not if both undefined + \ifx\caption@lfmt@simpleMagyar\@undefined\else + \babel@save\caption@lfmt + \let\caption@lfmt\caption@lfmt@simpleMagyar + \fi + \fi} + \@gobble +{^}% + + +% --- shortrefcmds= + +\if0\magyar@opt@@shortrefcmds\@@magyar@skiplong\fi + \def\azr{\aref}% better than \let, because it won't keep old value + \def\Azr{\Aref} + \def\azp{\apageref} + \def\Azp{\Apageref} + \def\azc{\acite} + \def\Azc{\Acite} + \@gobble +{^}% + +% --- longcaption= + +\ifx\magyar@caption@centering\@empty\@@magyar@skiplong\fi + \def\magyar@caption@hsizecheck{\hsize} + % We don't emit the two dots of `1. tblzat.' here, because + % has already been emitted by \fnum@table etc. + % We apply some formatting depending on the longcaption= option. + % Dat: Gyurgyk, p95. says: `11. bra. Hajtsi vltozatok.' + \let\@@magyar@do@makecaption\relax% before .toc + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \@@magyar@do@makecaption} + \def\@@magyar@do@makecaption@captiontwo@yes{% + % Dat: caption2.sty or caption3.sty is loaded; do nothing. + } + \def\@@magyar@do@makecaption@captiontwo@no{% + %** @param #1 \fnum@table or \fnum@figure + \def\@makecaption##1##2{% + \vskip\abovecaptionskip + \sbox\@tempboxa{##1.\ ##2}% Dat: `: ' changed to `. ' to match Hungarian typography + \ifdim \wd\@tempboxa>\magyar@caption@hsizecheck\relax + {\magyar@caption@centering ##1.\magyar@caption@newline ##2\csname par\endcsname}% + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \vskip\belowcaptionskip}} + \AtBeginDocument{% + \expandafter\ifx\csname captionlabeldelim\endcsname\relax + \expandafter\ifx\csname caption@lsep@period\endcsname\relax + \let\@@magyar@do@makecaption\@@magyar@do@makecaption@captiontwo@no + \else + % Dat: caption3.sty is loaded, and it has caption@lsep defined + % Dat: \show\caption@lsep@colon % \long\def\caption@lsep@colon{: } + % Dat: \show\caption@lsep %\def\caption@lsep{\caption@lsep@colon} + \ifx\caption@lsep\caption@lsep@default + % There was no \captionsetup{labelsep=...} yet, so we set the + % default to period (dot). + % + % This sets \caption@lsep@default and \caption@lsep. + \caption@setdefaultlabelsep{period}% + \fi + \let\@@magyar@do@makecaption\@@magyar@do@makecaption@captiontwo@yes + \fi + \else + % Dat: caption2.sty is loaded (and has \def\captionlabeldelim{.} -- but it might have {:}) + % Dat: we now redefine {:} to {.} + % Dat: the user can force {:} by \def\captionlabeldelim{:\empty} + % Dat: this works now: \usepackage[german,french,magyar]{babel} \usepackage{caption2} \begin{document} \renewcommand*\captionfont{\itshape} \renewcommand*\captionlabelfont{\scshape} + \def\reserved@a{:}% + \ifx\reserved@a\captionlabeldelim \def\captionlabeldelim{.}\fi + \let\@@magyar@do@makecaption\@@magyar@do@makecaption@captiontwo@yes + \fi} + \@gobble +{^}% + +% --- labelenums= + +\if0\magyar@opt@@labelenums \@@magyar@skiplong\fi + \providecommand\@greekalph[1]{% + % We use the robust \ensuremath here, similarly to \def\@fnsymbol in + % latex.ltx. + \ensuremath{\ifcase#1\or\alpha\or\beta\or\gamma\or\delta% + \or\varepsilon\or\zeta\or\eta\or\vartheta\or\iota\or\kappa% + \or\lambda\or\mu\or\nu\or\xi\or\varphi\or\varpi\or\varrho% + \or\varsigma\or\tau\or\upsilon\or\chi\or\psi\or\omega% + \else\@ctrerr\fi}} + \expandafter\ifx\csname c@enumv\endcsname\relax + \@definecounter{enumv}% call this before \def\theenumv + \fi + \if3\magyar@opt@@labelenums + \def\theenumi {\@arabic \c@enumi} \def\labelenumi {\theenumi.} + \def\theenumii {\@alph \c@enumii} \def\labelenumii {\itshape\theenumii)} + \def\theenumiii{\@greekalph\c@enumiii}\def\labelenumiii{\itshape\theenumiii)} + \def\theenumiv {\@Alph \c@enumiv} \def\labelenumiv {\itshape\theenumiv)} + \def\theenumv {\@Roman \c@enumv} \def\labelenumc {\theenumv.} % Dat: I'm not sure + \else + \def\theenumi{\@Roman\c@enumi} \def\labelenumi{\theenumi.} + \def\theenumii{\@arabic\c@enumii} \def\labelenumii{\theenumii.} + % !! correct \ref style for \the + \if1\magyar@opt@@labelenums % hu-a + \def\theenumiii{\@alph\c@enumiii} \def\labelenumiii{\itshape\theenumiii)} + \def\theenumiv{\@greekalph\c@enumiv} \def\labelenumiv{\itshape\theenumiv)} + \def\theenumv{\@Alph\c@enumv} \def\labelenumv {\itshape\theenumv)} + \else% hu-A + \def\theenumiii{\@Alph\c@enumiii} \def\labelenumiii{\itshape\theenumiii)} + \def\theenumiv{\@alph\c@enumiv} \def\labelenumiv{\itshape\theenumiv)} + \def\theenumv{\@greekalph\c@enumv} \def\labelenumv {\itshape\theenumv)} + \fi + \fi + \def\reserved@a{% copied from latex.ltx + \ifnum \@enumdepth >\thr@@\@toodeep\else + \advance\@enumdepth\@ne + \edef\@enumctr{enum\romannumeral\the\@enumdepth}% + \expandafter\list + \csname label\@enumctr\endcsname + {\usecounter\@enumctr\def\makelabel##1{\hss\llap{##1}}}% + \fi} + \ifx\reserved@a\enumerate + \def\enumerate{% no \@enumdepth>3 + \advance\@enumdepth\@ne + \expandafter\ifx\csname labelenum\romannumeral\the\@enumdepth\endcsname\relax + \@toodeep\advance\@enumdepth\m@ne\else + \edef\@enumctr{enum\romannumeral\the\@enumdepth}% + \expandafter\list + \csname label\@enumctr\endcsname + {\usecounter\@enumctr\def\makelabel##1{\hss\llap{##1}}}% + \fi} + \fi + \@gobble +{^}% + +% --- labelitems= + +\if0\magyar@opt@@labelitems \@@magyar@skiplong\fi + \def\labelitemi{\textendash} + % vvv Dat: formerly 2.5pt + \def\labelitemii {\raise0.58ex\hbox{\scriptsize\textbullet}} + \def\labelitemiii{\raise0.58ex\hbox{\(\scriptstyle\circ\)}} + \def\labelitemiv {\raise0.58ex\hbox{\scriptsize\textasteriskcentered}} + \def\labelitemv {\raise0.58ex\hbox{\scriptsize\textperiodcentered}} + \def\reserved@a{% copied from latex.ltx + \ifnum \@itemdepth >\thr@@\@toodeep\else + \advance\@itemdepth\@ne + \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% + \expandafter\list + \csname\@itemitem\endcsname + {\def\makelabel##1{\hss\llap{##1}}}% + \fi} + \ifx\reserved@a\itemize + \def\itemize{% no \@itemdepth>3 + \advance\@itemdepth\@ne + \expandafter\ifx\csname labelitem\romannumeral\the\@itemdepth\endcsname\relax + \@toodeep\advance\@enumdepth\m@ne\else + \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% + \expandafter\list + \csname\@itemitem\endcsname + {\def\makelabel##1{\hss\llap{##1}}}% + \fi} + \fi + \@gobble +{^}% + +% --- postpara= and postsubpara= and postdescription= + +\expandafter\ifx\csname magyar@opt@@paragraphs\endcsname\relax\@@magyar@skiplong\fi + % Dat: We make sure that hspaces emitted by \magyar@post@... are unstretchable + \def\magyar@post@dot{.\enskip}% + \def\magyar@post@bfdot{\textbf.\enskip}% + \let\magyar@post@quad\quad% not recommended in Hungarian + \let\magyar@post@enskip\enskip% not recommended in Hungarian + \def\magyar@post@em{\hskip1em\relax}% + \let\magyar@post@empty\@empty + %** from Gyurgy\'ak J\'anos: Szerkeszt\H{o}k \'es szerz\H{o}k k\'ezik\"onyve. + %** We don't have a square-shaped, black diamond in our math fonts :-(. + \def\magyar@post@diamond{% + \enskip\raise.5ex\hbox{\font\f=msam10 at1.3ex \f\char7}\enskip%\ignorespaces% raised \blacklozenge + %{\usefont{U}{msa}{m}{n}\small\char7} + } + \def\magyar@post@star{\enskip\({}^*\)\enskip}% + \def\magyar@post@endash{ -- }% + \def\magyar@post@semicolon{:\enskip}% + \def\magyar@first#1#2\vfuzz{\noexpand#1}% + %** Calls \magyar@pf@lowb, and never emits code resulting from #3 to TOC + %** @param #1 empty or `*' + %** @param #2 \@startsection{...}{...}... call + %** @param #3 \paragraph or \subparagraph (selects one of \magyar@post@...) + %** @param #4 paragraph title text + \def\magyar@pf@lowa#1#2#3#4{% + \if#1*\relax + \bbl@afterelse\magyar@pf@lowb*% + \else + \bbl@afterfi \magyar@pf@lowb{[#4]}% + \fi + {#2}{#3}{#4}% + }% + % !! a less obscure way for \paragraph, without -1sp etc. + %** Calls \magyar@pf@lowb, and never emits code resulting from #3 to TOC + %** @param #1 \@startsection{...}{...}... call + %** @param #2 \paragraph or \subparagraph (selects one of \magyar@post@...) + %** @param #3 paragraph title text + %** @param #4 [...] arg to \paragraph + \def\magyar@pf@lowc#1#2#3[#4]{% + \magyar@pf@lowb{[#4]}{#1}{#2}{#3}% + }% + %** Calls \magyar@post@paragraph and \magyar@post@subparagraph + %** @param #1 [#4] or `*' (what goes to TOC?) + %** @param #2 \@startsection{...}{...}... call + %** @param #3 \paragraph or \subparagraph + %** @param #4 paragraph title text + \def\magyar@pf@lowb#1#2#3#4{% + #2#1{#4\csname magyar@post@\expandafter\@gobble\string#3\endcsname\kern\z@}% + % ^^^ Dat: \kern\z@ is needed so \unskip won't occur at \paragraph* + % ^^^ Dat: {#4\csname...} is needed so \magyar@post@dot makes a {\bf.} + % Dat: \ignorespaces is superflous here, it also doesn't ignore \par + }% + %** Fixes (redefines) the specified macro so postpara= and postsubpara= + %** takes effect. It is useful to call this after a `\renewcommand\paragraph' + %** in a package. Has no effect if the definition of #1 doesn't look like + %** the one in article.cls (i.e. \@startsection) or if it's not defined + %** (such as in beamer.cls). + %** @param #1 \paragraph or \subparagraph + \def\magyar@paragraphfix#1{% + \ifx#1\@undefined\else + % Change only if defined. + \expandafter\magyar@paragraphfix@defined\expandafter#1\fi + } + \def\magyar@paragraphfix@defined#1{% + \expandafter\magyar@pf@lowd\expandafter#1#1\hfuzz........\vfuzz + } + \def\magyar@pf@lowd#1#2#3#4#5#6#7#8#9\vfuzz{% + % Dat: \unskip doesn't work, have to change \hskip to -1sp: 1sp is the + % amount of horizontal space between the diamond and the paragraph text + % 0sp would be bad, because it isn't negative (positive skips are + % interpreted as vertical). + %% + \expandafter\def\expandafter\reserved@a\expandafter{\magyar@first#9\vfuzz}% + %\def\reserved@a{#9}\ifx\reserved@a\@empty + \if\reserved@a\hfuzz\ifx#2\@startsection\if-\magyar@first#7\vfuzz + \def#1{\@ifstar + {\magyar@pf@lowa *{#2{#3}{#4}{#5}{#6}{-1sp}{#8}}#1}% + {\@ifnextchar[%] + {\magyar@pf@lowc{#2{#3}{#4}{#5}{#6}{-1sp}{#8}}#1}% + {\magyar@pf@lowa{}{#2{#3}{#4}{#5}{#6}{-1sp}{#8}}#1}% + }% + }% + \fi\fi\fi + } + % !! Imp: change Hungarian \paragraphs only, with dual load + \expandafter\ifx\csname magyar@opt@@postpara\endcsname\relax\else + \magyar@paragraphfix\paragraph + \expandafter\let\expandafter\magyar@post@paragraph\csname magyar@post@\magyar@opt@@postpara\endcsname + \ifx\magyar@post@paragraph\relax + \@@magyar@error{Invalid arg for option: postpara = \magyar@opt@@postpara}% + \fi + \fi + \expandafter\ifx\csname magyar@opt@@postsubpara\endcsname\relax\else + \magyar@paragraphfix\subparagraph + \expandafter\let\expandafter\magyar@post@subparagraph\csname magyar@post@\magyar@opt@@postsubpara\endcsname + \ifx\magyar@post@subparagraph\relax + \@@magyar@error{Invalid arg for option: postsubpara = \magyar@opt@@postsubpara}% + \fi + \fi + \expandafter\ifx\csname magyar@opt@@postdescription\endcsname\relax\else + \expandafter\let\expandafter\magyar@post@description\csname magyar@post@\magyar@opt@@postdescription\endcsname + \ifx\magyar@post@description\relax + \@@magyar@error{Invalid arg for option: postdescription = \magyar@opt@@postdescription}% + \fi + \def\magyar@@descriptionfont{\normalfont\bfseries}% + \def\descriptionlabel#1{\hskip\labelsep{\magyar@@descriptionfont#1}\magyar@post@description\hskip-\labelsep}% + \fi + \@gobble +{^}% + +% --- afterindent= + +\ifnum\magyar@opt@@afterindent>8 \@@magyar@skiplong\fi + \ifnum\magyar@opt@@afterindent<1 % force-no + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\@afterindenttrue + \let\@afterindenttrue\@afterindentfalse + }% + \else% force-yes + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\@afterindentfalse + \let\@afterindentfalse\@afterindenttrue + }% + \fi + \@gobble +{^} + +% --- default \frenchspacing; frenchspacing= + +\if0\magyar@opt@@frenchspacing \@@magyar@skiplong\fi + \if1\magyar@opt@@frenchspacing% =no + \def\@@magyar@antifrenchspacing{% only does some caching + \ifnum\the\sfcode`\.=\@m + \nonfrenchspacing + \let\@@magyar@nonfrenchspacing\frenchspacing + \else + \let\@@magyar@nonfrenchspacing\relax + \fi} + \let\@@magyar@nonantifrenchspacing\frenchspacing + \expandafter\addto\csname extras\CurrentOption\endcsname{\@@magyar@antifrenchspacing} + \expandafter\addto\csname noextras\CurrentOption\endcsname{\@@magyar@nonantifrenchspacing} + \else + \expandafter\addto\csname extras\CurrentOption\endcsname{\bbl@frenchspacing} + \expandafter\addto\csname noextras\CurrentOption\endcsname{\bbl@nonfrenchspacing} + \fi + \@gobble +{^} + + +% --- Putting dots after section number in toc/lof/lot; sectiondot= +% +% This is to have a dot after figure/table numbers in lof/lot and +% section numbers in toc. +% +% The option sectiondot= is ill-named, because it doesn't apply to what is +% displayed in \section, but it applies to \tableofcontents, \listoftables +% and \listoffigures. + +\if0\magyar@opt@@sectiondot \@@magyar@skiplong\fi + \ifnum\magyar@opt@@sectiondot>1 + % This solution (for sectiondot=problematic) is what was provided by + % magyar.ldf v1.4. It is incomatible with lots of packages. + % + % [pts] This doesn't work with nameref.sty. + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\@caption + \long\def\@caption#1[#2]#3{% + \csname par\endcsname + \addcontentsline{\csname ext@#1\endcsname}{#1}% + {\protect\numberline{\csname the#1\endcsname.}{\ignorespaces #2}}% + \begingroup + \@parboxrestore + \if@minipage + \@setminipage + \fi + \normalsize + \@makecaption{\csname fnum@#1\endcsname}% + {\ignorespaces #3}\csname par\endcsname + \endgroup}} + + % [pts] This is incompatible with some packages. + \expandafter\addto\csname extras\CurrentOption\endcsname{% + % Alas, \@sect must also be redefined to have that dot in toc too. + % On the other hand, we include a dot after a run-in head. + \babel@save\@sect + \def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{% + \@hangfrom{\hskip #3\relax\@svsec}% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname.}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8.}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname.}% + \fi + #7}}% + \fi + \@xsect{#5}}} + + % [pts] This is incompatible with some packages. + \expandafter\addto\csname extras\CurrentOption\endcsname{% + % In order to have that dot after a run-in head when the star form of the + % sectioning commands is used, we have to redefine \@ssect + \babel@save\@ssect + \def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{% + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5.}}% + \fi + \@xsect{#3}}} + \else + % This implements option sectiondot=safe. + % + % [pts] We definitely want \numberline to emit table number in \listoftables as + % `5.6.' instead of the default `5.6', but we don't want to redefine \@caption, + % because the # args \addcontentsline adds to \contentsline depends on whether + % nameref.sty (hyperref.sty) is loaded (no nameref: 3, w/ nameref: 4); this + % would cause the strange `Package hyperref Warning: No destination for + % bookmark of \addcontentsline'. + % So we rather redefine \numberline. But we cannot simply add a dot, because + % it might be already present (e.g in \tableofcontents). So we add a dot only + % if it is missing. This modification affects \tableofcontents, \listoffigures + % and \listoftables. The presence of the dot in TOC depends on the language + % the section was defined in. + % amsart.sty uses \tocsection instead of \numberline, see amstocnumskip= + % below + \def\magyar@striplastdot@lowa#1.\relax{#1\relax}% + \def\magyar@striplastdot@lowb#1\relax#2\relax{#1}% + %** \@tempdima is set by \@dottedtocline, called by \l@section + \def\magyar@numberline#1\vfuzz{\hb@xt@\@tempdima{#1.\hfil}}% + \def\@@magyar@numberline@pre#1{% + \expandafter\expandafter\expandafter\magyar@numberline + \expandafter\magyar@striplastdot@lowb\magyar@striplastdot@lowa#1\relax.\relax\vfuzz + }% + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\numberline + %** Overrides latex.ltx + \let\numberline\@@magyar@numberline@pre + } + \fi + \@gobble +{^} + +% --- amspostsectiondot= + +\if0\magyar@opt@@amspostsectiondot \@@magyar@skiplong\fi + % Now fix ams*.cls so that they don't put a dot after the section title. + % First check whether the definition of \@sect contains + % \global\@nobreaktrue\@xsect + \long\def\@@magyar@amssect@fixa#1\global\@nobreaktrue\@xsect#2\hfuzz#3{% + \ifx\hfuzz#2\hfuzz\else% found + \@@magyar@amssect@fixb#3\fi} + %** @param #1 a \cs, e.g \@sect + \def\@@magyar@amssect@fixb#1{% + \expandafter\let\csname @@magyar@amssect@saved\string#1\endcsname#1% + \edef#1{\noexpand\expandafter\noexpand\@@magyar@amssect@low + \expandafter\noexpand\csname @@magyar@amssect@saved\string#1\endcsname}% + \let\@svsechd\@empty% prevent Undefied \cs + %** Definition of \@sect in ams*.cs ends by `\global\@nobreaktrue{#5}' + \long\def\@@magyar@amssect@low##1\global\@nobreaktrue{% + ##1% + \expandafter\def\expandafter\@svsechd\expandafter{% + \expandafter\let\expandafter\@addpunct\expandafter\@gobble \@svsechd}% + \global\@nobreaktrue + }% + } + \expandafter\@@magyar@amssect@fixa\@sect[][][][][][][][]\global\@nobreaktrue\@xsect\hfuzz\@sect + \expandafter\@@magyar@amssect@fixa\@sect[][][][][][][][]\global\@nobreaktrue\@xsect\hfuzz\NR@sect% with nameref.sty + \@gobble +{^}% + +% --- amstocnumskip=, amstocnumlang= +% +% Change \tocsection, \tocsubsection etc. in amsart.cls etc. These commands +% have effect in \tableofcontents, e.g. in the .toc file: +% `\contentsline {section}{\tocsubsection {}{1.1}{Foo}}{1}' +% +% We should be careful not to define \tocchapter and \tocsection if +% tocbibind.sty is (or will be) loaded, because it provides its own definition +% as \newcommand. + +\ifx\@empty\magyar@opt@@amstocnumskip \@@magyar@skiplong\fi + % Similar to titleskip=, but AMS classes don't look at \@seccntformat + \def\@@magyar@amstocnumskip@lets{% + \ifx\tocsubsection\@undefined\else + \ifx\tocsubsection\tocparagraph + \def\tocsubsection{\tocsection}% + % These lines are similar to those in amsart.cls. + \let\tocsubsubsection\tocsubsection + \let\tocparagraph\tocsubsection + \let\tocsubparagraph\tocsubsection + \let\tocpart\tocsubsection + \let\tocchapter\tocsubsection + \fi + \fi + }% + \def\@@magyar@amstocnumskip@defs{% + \ifx\tocsubsection\@undefined\else + \ifx\tocsubsection\tocparagraph + %** Overrides amsart.cls, amsbook.cls etc. + %** Only for Hungarian \section{}s. Changes \quad to + %** \magyar@opt@@amstocnumskip in the definition. Also changes + %** ``fejezet 1'' to ``1. fejezet'' for \chapter + %** (We have \def\tocchapter{\tocsection} by default.) + \def\tocsection##1##2##3{% + %%\typeout{--##3--}% + \indentlabel{% + \def\reserved@a{##1}% + \def\reserved@b{##2}% + \ifx\reserved@b\empty + \else\ifx\reserved@a\chaptername + % * Sometimes (but not in \tableofcontents) #1 is + % `\csname chaptername\endcsname'. Why? + % * \tocappendix is called instead of \tocsection for the + % appendix. + \ifnum\magyar@opt@@chapternumber=1 \@huordinal{##2}~% + \else\ifnum\magyar@opt@@chapternumber=2 \@Huordinal{##2}~% + \else##2.~% + \fi\fi + ##1.\magyar@opt@@amstocnumskip + \else\ifx\reserved@a\partname + \ifnum\magyar@opt@@partnumber=1 \@huordinal{##2}~% + \else\ifnum\magyar@opt@@partnumber=2 \@Huordinal{##2}~% + \else##2.~% + \fi\fi + ##1.\magyar@opt@@amstocnumskip + \else + \ignorespaces##1 ##2.\magyar@opt@@amstocnumskip + \fi\fi\fi}% + ##3}% + %** Overrides amsart.cls etc. Only for Hungarian \section{}s. Changes \quad to + %** \magyar@opt@@amstocnumskip in the definition. + \def\tocappendix##1##2##3{% + \indentlabel{% + \def\reserved@a{##1}% + \ifx\reserved@a\appendixname + ##2\ifx\@@magyar@appendixname\@empty.\fi~##1% + \else + ##1\@ifnotempty{##2}{ ##2}% + \fi + .\magyar@opt@@amstocnumskip}% + ##3}% + \fi + \fi + }% + \AtBeginDocument\@@magyar@amstocnumskip@lets % must be before @defs + \if2\magyar@opt@@amstocnumlang + \AtBeginDocument\@@magyar@amstocnumskip@defs + %\let\@@magyar@amstocnumskip@defs\@undefined% for use by the user + \else + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\tocsection \babel@save\tocappendix + \@@magyar@amstocnumskip@defs + } + \fi + \@gobble +{^}% + + +% --- Fixup Babel language selection glitches; toclang= + +% There are fundamental problem of emitting \select@language items in LOT +% files. +% +% Problem (3): When using \begin{table}...\end{table} \selectlanguage{foo} +% \begin{table}...\end{table}, the LaTeX-Babel scheme will not emit a +% \select@language{foo} between the two \contentsline{}s in \jobname.lot. The +% TOC file is OK, because section titles aren't floats. (But what about +% \mark{}s?). +% +% Problem (1): \selectlanguage emits .aux entries even +% if the language isn't really changed. +% +% Problem (2): babel.def has +% `\AtBeginDocument...\selectlanguage...\bbl@main@language', from which an +% \immediate is missing, so the \select@language is emitted to the .aux file +% after the first float has been typeset. A better solution would be +% `\select@language{\languagename}', which forcibly activates the default +% language. +% +% Problem (4): \ps@headings isn't run \AtBeginDocument, but book.cls runs +% \pagestyle{headings} when it is loaded. We should change this to +% \AtBeginDocument or similar. + +\ifnum\magyar@opt@@toclang=0 \@@magyar@skiplong\fi + \ifnum\magyar@opt@@toclang>1 % toclang=good + % Solve problems (2) and (4). Timing is critical. \select@language must + % be called after \AtBeginDocument, so \catcode{}s won't be \activated + % too early. (Because some code in \AtBeginDocument might issue an + % \input such as hyperref.sty which does \RequirePackage{nameref}.) + % Note that \extrasmagyar containing the \catcode changes is + % only run when `magyar' is the default language (last arg of + % \usepackage[...]{babel}). If that is run after \AtBeginDocument hooks, + % then most packages will use 12 as \catcode\string``, which is intended. + % \@@magyar@setup@psheadings might just be run \AtBeginDocument, it doesn't + % need \@preamblecmds -- but it must be after \select@language. + % + % \@preamblecmds is expanded after \@begindocumenthook + \expandafter\gdef\expandafter\@preamblecmds\expandafter{\@preamblecmds + \@@magyar@setup@psheadings% Solve problem (4). Before \selectlanguage. + \select@language{\languagename}% force initial language + }% + % Solve problem (1) and assist solving problem (2) by not emitting + % \select@language twice. + \def\bbl@set@language#1{% + \edef\@Lang@tmp{% + \ifcat\noexpand\noexpand\noexpand#1% a control sequence + \expandafter\expandafter\expandafter\@gobble\expandafter\string + \fi + #1% + }% + \ifx\languagename\@Lang@tmp\else + \let\languagename\@Lang@tmp + \select@language{\languagename}% + \fi + }% + % Solve problem (3). + \long\def\addtocontents#1#2{% + % Dat: \noexpand should be avoided in \protected@write + \protected@write\@auxout + {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble \let\select@language\relax}% + {\string\@writefile{#1}{\string\select@language{\languagename} #2}}} + \else + % Solve problems (2) and (4). + \AtBeginDocument{% + \if@filesw \immediate\write\@mainaux{% + \string\select@language{\languagename}% + \string\@writefile{toc}{\string\select@language{\languagename}}% + \string\@writefile{lof}{\string\select@language{\languagename}}% + \string\@writefile{lot}{\string\select@language{\languagename}}% + }\fi + \@@magyar@setup@psheadings% Solve problem (4). Before \selectlanguage. + \select@language{\languagename}% force initial language + } + % Solve problem (1) and assist solving problem (2) by not emitting + % \select@language twice. + \def\bbl@set@language#1{% + \edef\@Lang@tmp{% + \ifcat\noexpand\noexpand\noexpand#1% a control sequence + \expandafter\expandafter\expandafter\@gobble\expandafter\string + \fi + #1% + }% + \ifx\languagename\@Lang@tmp\else + \let\languagename\@Lang@tmp + \select@language{\languagename}% + \if@filesw \protected@write\@auxout{}{% + \string\select@language{\languagename}% + \string\@writefile{toc}{\string\select@language{\languagename}}% + \string\@writefile{lof}{\string\select@language{\languagename}}% + \string\@writefile{lot}{\string\select@language{\languagename}}% + \fi}% + \fi + }% + % Don't solve problem (3). + \fi + \@gobble +{^}% + +% --- suggestions= + +\ifnum\magyar@opt@@suggestions=0 \@@magyar@skiplong\fi + % Dat: buggy varioref.sty adds this to extrasmagyar (\AtBeginDocument is + % buggy, can be used only in the preamble. + % \def\reftextfaceafter {a k\"o\-vet\-kez\H{o} ol\-da\-lon}% + % \def\reftextfacebefore{az el\H{o}\-z\H{o} ol\-da\-lon}% + % \def\reftextafter {a k\"o\-vet\-kez\H{o} ol\-da\-lon}% + % \def\reftextbefore {az el\H{o}\-z\H{o} ol\-da\-lon}% + % \def\reftextcurrent {ezen az ol\-da\-lon}% + % \def\reftextfaraway#1{\aza{\pageref{#1}} \pageref{#1}.~ol\-da\-lon}% + % \def\reftextpagerange#1#2{\vref@stringwarning\reftextpagerange + % on pages~\pageref{#1}--\pageref{#2}}% + % \def\reftextlabelrange#1#2{\vref@stringwarning\reflabelpagerange + % \ref{#1} to~\ref{#2}}% + % \AtBeginDocument{\providecommand\aza[1]{a/az% + % \PackageError{varioref}{% + % Proper definition for command \noexpand\aza missing}% + % {You need to (re)define the command \noexpand\aza that + % takes one argument (a number or a \noexpand\pageref command) + % and produces the string `a' or `az' depending on the argument + % value. It should also accept an optional argument (default `l') + % to denote whether or not the string should be lowercase or + % uppercase.}}}% + \def\@@magyar@ignorehbox@pree#1\hbox$#2{}%$ + %\def\@@magyar@grep@reftextcurrent#1\def\reftextcurrent#2\hbox$ + \def\@@magyar@grep@reftextbegin#1\def\reftextfaceafter#2\hfuzz\hfuzz\hfuzz#3\hbox$#4{%$ + \toks@={#1#3}% Dat: # -> ## conversion for \def + \expandafter\global\expandafter\edef\csname extras#4\endcsname + {\the\toks@}% + } + \def\@@magyar@grep@reftextcurrent#1\def\reftextlabelrange#2#3#4#5#6% + \AtBeginDocument#7#8\hbox$#9{%$ Dat: no need for \long\def + % ^^^ Dat: Don't use `#21', because then #2 would match multiple tokens + \ifx#31% found real data, not sentinel + \PackageWarningNoLine{#9.ldf}{Do not load buggy \string\usepackage[magyar]{varioref},\MessageBreak load simply \string\usepackage{varioref}}% + % vvv remove code inserted by varioref.sty + \@@magyar@grep@reftextbegin#1\hfuzz\hfuzz\hfuzz#8\hbox${#9}%$ + \fi + } + \def\magyar@sugg@vr#1{% + \expandafter\expandafter\expandafter\@@magyar@grep@reftextcurrent + \csname extras#1\endcsname\hbox${#1}\@@magyar@ignorehbox@pree%$ + \def\reftextlabelrange23456\AtBeginDocument78\hbox${#1}%$ + } + \def\magyar@sugg@to#1{% + \def\reserved@a{T1} + \edef\reserved@b{\encodingdefault}% \encodingdefault is \long for t1enc.sty, but not for fontenc.sty + \ifx\reserved@a\reserved@b\else + \@latex@warning@no@line{Please use \string\usepackage{t1enc} with\MessageBreak \string\usepackage[#1]{babel}, to get accented chars hyphenated}% + % ^^^ Dat: \usepackage[T1]{fontenc} is equally good, but less effective + \fi + } + \def\magyar@sugg@ie@lowb#1{\@latex@warning@no@line{% + Please use \string\usepackage[latin2]{inputenc}\MessageBreak + or \string\usepackage[utf8]{inputenc}\MessageBreak + with \string\usepackage[#1]{babel}}}% + %** @param #1 empty (old) or \protect + %** @param #2 input encoding name + \def\magyar@sugg@ie@low#1\@inpenc@undefined@#2#3\vfuzz#4{% + \def\reserved@b{#2}% + \def\reserved@a{latin2}% + \ifx\reserved@a\reserved@b\else + \def\reserved@a{utf8}% + \ifx\reserved@a\reserved@b\else + \def\reserved@a{utf8x}% + \ifx\reserved@a\reserved@b\else + \def\reserved@a{cp1250}% + \ifx\reserved@a\reserved@b\else + \magyar@sugg@ie@lowb{#4}% + \fi + \fi + \fi + \fi + } + \def\magyar@sugg@ie#1{% + % Dat: don't print warning for missing \usepackage + \expandafter\ifx\csname @inpenc@undefined\endcsname\relax + \magyar@sugg@ie@lowb{#1}% + \else + % from inputenc.sty: \edef\@inpenc@undefined{\noexpand\@inpenc@undefined@{#1}}% + % > \@inpenc@undefined=macro: + % ->\@inpenc@undefined@ {latin2}. + \expandafter\magyar@sugg@ie@low\@inpenc@undefined....\vfuzz{#1}% + \fi + }% + \def\magyar@sugg@af#1{% + \expandafter\ifx\csname#1Options\endcsname\relax\else + \PackageWarningNoLine{#1.ldf}{No effect of \string\def\@backslashchar #1Options{...}\MessageBreak + please move it before \string\usepackage[#1]{babel}}% + \fi + }% + \def\@@magyar@@ps@fancy{\relax}%\@fancyplainfalse\ps@@fancy}% + \def\magyar@sugg@fh#1{% + \ifx\ps@fancy\@@magyar@@ps@fancy + \PackageWarningNoLine{#1.ldf}{No effect on fancyhdr.sty,\MessageBreak + please load it before \string\usepackage[#1]{babel}}% + \fi + }% + \def\magyar@sugg@ap#1{% + \expandafter\ifx\csname opt@#1.ldf.sty\endcsname\relax\else + \PackageWarningNoLine{#1.ldf}{No effect of \@backslashchar PassOptionsToPackage{?}{#1.ldf}\MessageBreak + please move it before \string\usepackage[#1]{babel}}% + \fi + }% + \edef\reserved@a{\noexpand\AtBeginDocument{% + \noexpand\magyar@sugg@pa{\CurrentOption}% + \noexpand\magyar@sugg@af{\CurrentOption}% + \noexpand\magyar@sugg@ap{\CurrentOption}% + \noexpand\magyar@sugg@to{\CurrentOption}% + \noexpand\magyar@sugg@ie{\CurrentOption}% + \noexpand\magyar@sugg@vr{\CurrentOption}% + \noexpand\magyar@sugg@fh{\CurrentOption}% + }}\reserved@a + \@gobble +{^}% + +% --- Active characters and shorthands; active=, activeprefix=, activespace= + +\ifnum0=\magyar@opt@@activespace\magyar@opt@@active\space + \def\@@magyar@declare@shorthandx#1#2{% + \expandafter\def\csname @@magyar@shorthand@\string#1\endcsname{#2}% + } +\@@magyar@skiplong\fi + \def\magyar@activate@shorthands{% + \edef\reserved@a{% + \noexpand\addto\expandafter\noexpand\csname extras\CurrentOption\endcsname + {\noexpand\languageshorthands{\CurrentOption}}% + } + \reserved@a + \let\magyar@activate@shorthands\relax + } + \let\@@magyar@saved@initiate@active@char\initiate@active@char + % + % vvv Fri Oct 1 18:09:55 CEST 2004 + % This is the ultimate fix of the .aux file catcodes when + % \usepackage[german,magyar]{babel} or + % \usepackage[french,magyar]{babel}. + % This enforces \catcode\string``=12 very early into the .aux file. + % Imp: don't let \catcode``\active too early... + {\toks@\expandafter{\expandafter\@@magyar@protect@backtick\@begindocumenthook}% + \xdef\@begindocumenthook{\the\toks@}}% Dat: \@begindocumenthook has #1 #2 etc. + \def\@@magyar@protect@backtick{% + \if@filesw\immediate\write\@auxout{\catcode\noexpand\string``=12}\fi} + % + %** @param #1 a non-active char token + %** @param #2 activation type: 0, 1, 2 or 3 + % !! quick link to \@@magyar@shorthand + \def\magyar@activate@char#1#2{% + \ifnum#2>1 % ignore 0 and 1 + \ifnum#2>2 % 3 + % SUXX, breaks compatibility with graphicx.sty and hyperref.sty and possibly + % with many other packages using \catcode`` etc. + %** Fix .aux load timing bug. + \AtBeginDocument{% + \if@filesw\immediate\write\@auxout{\catcode\noexpand\string`#1=12}\fi + } + \initiate@active@char{#1}% + \else% 2 + % Dat: german.ldf emits `\catcode`"\active'; we should emit our + % catcode change (\catcode\string``=12) before that + % Dat: this works only with \usepackage[magyar,german,magyar]{babel}, + % not with \usepackage[german,magyar]{babel} + % solution: \AtBeginDocument{\if@filesw\immediate\write\@auxout{\catcode\noexpand\string`#1=12}\fi} + \let\magyar@saved@AtBeginDocument\AtBeginDocument + \let\AtBeginDocument\@gobble + % vvv Calls \AtBeginDocument to set \catcode to \active and also write such a + % line to the .aux file. We just ignore it. + \initiate@active@char{#1}% + \let\AtBeginDocument\magyar@saved@AtBeginDocument + \let\magyar@saved@AtBeginDocument\@undefined + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@savevariable{\catcode\string`#1}% + \catcode\string`#1=13 % + }% + \fi + % Dat: now #1 is \active (done by \initiate@active@char) + \lccode\string`~=\string`#1\lowercase{% Dat: luckily everything below is in lowercase + \expandafter\addto\csname extras\CurrentOption\endcsname {\bbl@activate{~}}% + \expandafter\addto\csname noextras\CurrentOption\endcsname{\bbl@deactivate{~}}% + } + \lccode\string`~=0 + \catcode\string`#1=12 % Imp: restore _old_ catcode + \fi + } + %** @param #1 shorthand prefix character (depends on activeprefix=) + %** @param #2 a single character (will be prefixed) + %* @param #3 TeX code + \def\@@magyar@declare@shorthand@low#1#2#3{% + \declare@shorthand{\CurrentOption}{#1#2}{#3}% + } + \edef\@@magyar@shorthandprefix{\string`}% + %** @param #1 a single character (will be prefixed by ``' etc.) + %* @param #2 TeX code + %\def\@@magyar@declare@shorthand#1#2{\magyar@opt@@activeprefix#1{#2}}% defined below + \ifx\magyar@opt@@activeprefix\relax + \def\magyar@opt@@active{0}% =none + \def\magyar@opt@@openqq{0}% =unchanged (this must be defined before processing openqq below) + \else\edef\@@magyar@declare@shorthand#1#2{\noexpand\@@magyar@declare@shorthand@low\expandafter\string\magyar@opt@@activeprefix#1{#2}}\fi + %\magyar@activate@shorthands% not yet + \def\@@magyar@declare@shorthandx#1#2{% + \magyar@activate@shorthands + \expandafter\def\csname @@magyar@shorthand@\string#1\endcsname{#2}% + \expandafter\@@magyar@declare@shorthand\expandafter#1\expandafter{\csname @@magyar@shorthand@\string#1\endcsname}% + } + \@gobble +{^}% + +%** Call \@@magyar@shorthand@... For example: {`tty} and +%** {\@@magyar@shorthand tty} are interchangeable. +%** @param #1 a char token. +\def\@@magyar@shorthand#1{% + \expandafter\ifx\csname @@magyar@shorthand@\string#1\endcsname\relax + \@@magyar@error{Unknown shorthand: \string#1 }% + \else + \expandafter\expandafter\csname @@magyar@shorthand@\string#1\endcsname + \fi +} + +% --- activespace= Extra \thispace before :, ;, ! and ? +% +% french.ldf has \space after `:', but we only have \thinspace + +\ifnum\magyar@opt@@activespace=0 \@@magyar@skiplong\fi + %** @param #1 any of : ; ! ? + \def\magyar@thinspaced#1{% + % Dat: `!' at the end of the word is OK, but at the beginning it makes the + % word unhyphenatable. Imp: maybe \nobreak\hskip\z@skip? + % Dat: this is math-mode safe, because \ifhmode is false in math mode + \ifhmode% \ifhmode and \ifmmode are never true + \ifdim\lastskip>\z@ + \unskip\penalty\@M\kern.1em% \thinspace is .16667em + \else + \kern.1em + \fi + \fi + \string#1% + } + \magyar@activate@shorthands + \magyar@activate@char;\magyar@opt@@activespace + \declare@shorthand{\CurrentOption}{;}{\magyar@thinspaced;} + \magyar@activate@char!\magyar@opt@@activespace + \declare@shorthand{\CurrentOption}{!}{% + \ifmmode + \expandafter\ifx\csname factorial\endcsname\relax\mathchar"5021 \else\factorial\fi + \else\magyar@thinspaced!\fi} + % ^^^ compatibility with nath.sty + \magyar@activate@char?\magyar@opt@@activespace + \declare@shorthand{\CurrentOption}{?}{\magyar@thinspaced?} + \magyar@activate@char:\magyar@opt@@activespace + \declare@shorthand{\CurrentOption}{:}{\magyar@thinspaced:} + \@gobble +{^}% + + +% --- active= +% +% Dat: active=safe isn't safe unless other .ldf files used don't call +% \initiate@active@char{`}. +% +% `` `' `= `_ `-- `- `| `< `> `" `~ etc. + +\ifnum\magyar@opt@@active=0 + \ifnum\magyar@opt@@openqq>0 \@@magyar@error{active=none implies openqq=unchanged}\fi +\@@magyar@skiplong\fi + \ifnum\magyar@opt@@active>1 + \magyar@activate@shorthands% Dat: don't do it if \magyar@opt@@active=0 + \expandafter\magyar@activate@char\magyar@opt@@activeprefix\magyar@opt@@active + \fi + % + \ifnum\magyar@opt@@openqq>1 % =down + % Same as in in ukraineb.ldf + \@@magyar@declare@shorthandx`{\glqq}% down 99 \glqq is Babel's macro containing \quotedblbase + \@@magyar@declare@shorthandx'{\grqq}% up 66 + \else\ifnum\magyar@opt@@openqq>0 % =up + \@@magyar@declare@shorthandx`{\grqq}% up 66 + \@@magyar@declare@shorthandx'{\glqq}% down 99 + \else + \dMf @@magyar@shorthand@\string` {\string`\string`}% unchanged -- expect a ligature in font + \dMf @@magyar@shorthand@\string' {\string`\string'}% unchanged -- expect a ligature in font + \fi\fi + % + %** A hyphen, but hyphenation is OK at both sides + %** reported and asked by Jzsa Mrton + \@@magyar@declare@shorthandx ={\leavevmode\nobreak-\hskip\z@skip} + % ^^^ Dat: no need for \nobreak\hskip\z@skip, because of the empty discretionary + %** \shu?-- typesets an endash (--) with a small space around it (the one to + %** the right is breakable). \shu?- typesets a normal hyphen, having + %** hyphenation OK at both sides. + %** @example Kiss Eld\shu?--Nagy Pl + %** @example kzgazdasg\shu?-tudomnyi + \def\@@magyar@shorthandminus{% + \ifmmode \mskip2.4mu plus3.6mu minus1.8mu \else % ,`- is just a space in math mode + \if-\noexpand\@Lang@tmp \leavevmode\nobreak\,\nobreak\hbox{--}\,\expandafter\expandafter\expandafter\@gobble% Dat: \@gobble - + \else \leavevmode\nobreak-\hskip\z@skip\fi% Dat: e.g hegyes`-szg + \fi + } + \@@magyar@declare@shorthandx -{\futurelet\@Lang@tmp\@@magyar@shorthandminus}% + %** A hyphen that is displayed in both next and current lines. Hyphenation + %** is OK at both sides. This differs from ukraineb.ldf. + %** \showhyphens{ntrium`|klorid} -> nt-ri-um--klo-rid + \@@magyar@declare@shorthandx |{\leavevmode\nobreak-\nobreak\discretionary{}{-}{}\nobreak\hskip\z@skip}% Dat: all \nobreak s are important % e.g egyszer`|ktszer + \@@magyar@declare@shorthandx _{\leavevmode\nobreak\-\nobreak\hskip\z@skip} + \@@magyar@declare@shorthandx <{\flqq} + \@@magyar@declare@shorthandx >{\frqq} + \@@magyar@declare@shorthandx "{\hskip\z@skip}% \allowbreak, but hyphenation is OK at both sides + \@@magyar@declare@shorthandx ~{\textormath{\leavevmode\hbox{-}}{-}}% a hyphen that isn't part of ligatures -- and --- + % + % Dat: `CXY means \discretionary{CS-}{XY}{CXY}, which makes sense only for + % `CCS. But `Ccs wouldn't make sense, since there is no Hungarian word + % (whose first letter has to be capitalized) beginning with ccs. + % Dat: \nobreak\bbl@allowhyphens: \showhyphens{ho`sszabbra} -> hosz-szabb-ra + % Dat: \def\foo{`}\declare@shorthand{\CurrentOption{\foo c}{...} doesn't work + % Dat: these work quite well in math mode + % Dat: \showhyphens{a\hskip\z@skip b} displays "ab", but + % \showhyphens{a\hskip0pt b} displays "a b" + %** These should be equivalent: + %** \showhyphens{verembepot\nobreak\discretionary{y-}{}{}\nobreak\hskip\z@skip tyantam} + %** \showhyphens{verembepo`ttyantam} + \def\@@magyar@disc#1#2{#1\textormath{\nobreak\discretionary{#2-}{}{}}{}\nobreak\hskip\z@skip}% + \@@magyar@declare@shorthandx c{\@@magyar@disc cs}% loccsan --> locs-csan (lo`ccsan) + \@@magyar@declare@shorthandx C{\@@magyar@disc CS} + \@@magyar@declare@shorthandx g{\@@magyar@disc gy}% poggy\'asz --> pogy-gy\'asz (po`ggy\'asz) + \@@magyar@declare@shorthandx G{\@@magyar@disc GY} + \@@magyar@declare@shorthandx l{\@@magyar@disc ly}% Kod\'allyal --> Kod\'aly-lyal (Kod\'a`llyal) + \@@magyar@declare@shorthandx L{\@@magyar@disc LY} + \@@magyar@declare@shorthandx n{\@@magyar@disc ny}% mennyei --> meny-nyei (me`nnyei) + \@@magyar@declare@shorthandx N{\@@magyar@disc NY} + \@@magyar@declare@shorthandx s{\@@magyar@disc sz}% vissza --> visz-sza (vi`ssza) + \@@magyar@declare@shorthandx S{\@@magyar@disc SZ} + \@@magyar@declare@shorthandx t{\@@magyar@disc ty}% pottyan --> poty-tyan (po`ttyan) + \@@magyar@declare@shorthandx T{\@@magyar@disc TY} + \@@magyar@declare@shorthandx z{\@@magyar@disc zs}% rizzsel --> rizs-zsel (ri`zzsel) + \@@magyar@declare@shorthandx Z{\@@magyar@disc ZS} + \def\magyar@fixddzs{\@@magyar@declare@shorthandx d{% bridzs-dzsel + % vvv doesn't handle the rare combination dzs-dzs + %\@@magyar@declare@shorthandx D}{\@@magyar@disc DZ} + %\@@magyar@declare@shorthandx d}{\@@magyar@disc dz}% eddz\"unk (felsz. m.) --> edz-dz\"unk (e`ddz\"unk) + \def\reserved@a{% + \if\noexpand\reserved@b d% + \def\reserved@a{% + \if\noexpand\reserved@b z% + \def\reserved@a{% + \nobreak% so word before `ddzs gets hyphenated + \if\noexpand\reserved@b s% + \discretionary{dzs-}{dz}{ddz}% \showhyphens{szuper`ddzsungelben} + \else + \discretionary{dz-}{d}{dd}z% \showhyphens{szuper`ddzungelben} + \fi + \nobreak\hskip\z@skip% allow both pre- and post breaks + }% + \bbl@afterelse\expandafter\futurelet\expandafter\reserved@b\expandafter\reserved@a\@gobble + \else + \bbl@afterfi dd% + \fi + }% + \bbl@afterelse\expandafter\futurelet\expandafter\reserved@b\expandafter\reserved@a\@gobble + \else\bbl@afterfi d\fi + }% + \futurelet\reserved@b\reserved@a% doesn't remove next token + }}% + \magyar@fixddzs \expandafter\uppercase\expandafter{\magyar@fixddzs} + \@gobble +{^}% + + +% --- hunumbers= + +\ifnum\magyar@opt@@hunumbers=0 \@@magyar@skiplong\fi +\def\@@magyar@egyjegyu#1{% + \ifcase#1 \or\or k\'et\or h\'arom\or n\'egy\or \"ot\or hat\or h\'et\or + nyolc\or kilenc\fi +} +\def\@@magyar@upperfi@nine#1\fi\fi\fi\fi\fi\fi\fi\fi\fi{\fi\fi\fi\fi\fi\fi\fi\fi\fi#1} +\def\@@magyar@upperelse@nine#1\else#2\fi\fi\fi\fi\fi\fi\fi\fi\fi{\fi#1} +\def\@@magyar@uppernum#1{% + \ifx#1\"\@@magyar@upperelse@nine\"O\@gobble% \"o + \else\if\noexpand#1eE% + \else\if\noexpand#1hH% + \else\if\noexpand#1kK% + \else\if\noexpand#1mM% mnusz + \else\if\noexpand#1nN% + \else\if\noexpand#1oO% + \else\if\noexpand#1sS% sokadik + \else\if\noexpand#1tT% + \else\@@magyar@upperfi@nine\expandafter\@@magyar@uppernum#1% do an extra expansion + \fi\fi\fi\fi\fi\fi\fi\fi\fi +} +%** For \pagenumbering{huordinal}. Expands to the Hungarian ordered numeral, +%** spelled out in letters (i.e 1 --> first --> els). Suitable for numbering +%** \part{}s and \chapter{}s of a book (\def\thepart{\@Huordinal\c@part}}) +%** @param #1 a number (input for \number) in -9999..9999 +\def\@huordinal#1{% + % !! larger numbers, also for \@hunumeral + \ifnum#1=-1 m\'nusz egyedik\else + \ifnum#1=-2 m\'nusz kettedik\else + \ifnum#1<0 m\'inusz \expandafter\@huordinal\expandafter{\number-#1 }\else + \ifcase\number#1 nulladik\or els\H o\or m\'asodik\or harmadik\or negyedik\or + \"ot\"odik\or hatodik\or hetedik\or nyolcadik\or kilencedik\else + \ifnum#1>999 \expandafter\@@magyar@ezresedik\number#1.\else + \ifnum#1>99 \expandafter\@@magyar@szazasodik\number#1\else + \expandafter\@@magyar@tizesedik\number#1% + \fi\fi\fi\fi\fi\fi +} +%** @param #1#2 1000..9999 +\def\@@magyar@ezresedik#1#2.{% + \ifnum#1#2>9999 sokadik\else + \@@magyar@egyjegyu#1% + \ifnum#2=0 ezredik\else + ezer\ifnum#1>1 -\fi% ktezer-harmadik + \ifnum#2<100 + \expandafter\@@magyar@tizesedik\number#2% + \else + \ifnum#2<200 egy\fi% ezerszzadik -> ezeregyszzadik + \@@magyar@szazasodik#2% + \fi + \fi + \fi +} +%** @param #1#2 100..999 +%** Imp: binary search +\def\@@magyar@szazasodik#1#2#3{% + \@@magyar@egyjegyu#1sz\'az% + \@@magyar@tizesedik#2#3% +} +%** @param #1 a digit +%** @param #2 a digit +%** Imp: binary search +\def\@@magyar@tizesedik#1#2{% + \ifnum#1#2>89 kilencven\@@magyar@egyesedik#2e% + \else\ifnum#1#2>79 nyolcvan\@@magyar@egyesedik#2a% + \else\ifnum#1#2>69 hetven\@@magyar@egyesedik#2e% + \else\ifnum#1#2>59 hatvan\@@magyar@egyesedik#2a% + \else\ifnum#1#2>49 \"otven\@@magyar@egyesedik#2e% + \else\ifnum#1#2>39 negyven\@@magyar@egyesedik#2e% + \else\ifnum#1#2>29 harminc\@@magyar@egyesedik#2a% + \else\ifnum#1#2>20 huszon\@@magyar@egyesedik#2.% + \else\ifnum#1#2=20 huszadik% + \else\ifnum#1#2>10 tizen\@@magyar@egyesedik#2.% + \else\ifnum#1#2=10 tizedik% + \else \@@magyar@egyesedik#2a% ``ktszzadik'' + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi +}% +\def\@@magyar@egyesedik#1#2{% + \ifcase#1 #2\or egye\or kette\or harma\or negye\or + \"ot\"o\or hato\or hete\or nyolca\or kilence\fi dik% +} +%** Same as \@huordinal, but uppercase +\def\@Huordinal#1{% + % Dat: \newlabel{hellopart}{{Els\H o}{3}} is correctly written out + \ifcase#1 Nulladik\or Els\H o\or M\'asodik\or Harmadik\or Negyedik\or + \"Ot\"odik\or Hatodik\or Hetedik\or Nyolcadik\or Kilencedik\or Tizedik% + \or Tizenegyedik\or Tizenkettedik\else\@@magyar@uppernum\@huordinal{#1}\fi +} +\def\huordinal#1{\expandafter\@huordinal\csname c@#1\endcsname} +\def\Huordinal#1{\expandafter\@Huordinal\csname c@#1\endcsname} + +%** For \pagenumbering{hunumeral}. Expands to the Hungarian ordered numeral, +%** spelled out in letters (i.e 1 --> first --> els). Suitable for numbering +%** \part{}s and \chapter{}s of a book (\def\thepart{\@Hunumeral\c@part}}) +%** @param #1 a number (input for \number) in -9999..9999 +\def\@hunumeral#1{% + \ifnum#1<0 m\'inusz \expandafter\@hunumeral\expandafter{\number-#1 }\else + \ifcase#1 nulla\or egy\or kett\H{o}\or h\'arom\or n\'egy\or + \"ot\or hat\or h\'et\or nyolc\or kilenc\else + \ifnum#1>999 \expandafter\@@magyar@ezer\number#1.\else + \ifnum#1>99 \expandafter\@@magyar@szaz\number#1\else + \expandafter\@@magyar@tiz\number#1% + \fi\fi\fi\fi +} +%** @param #1#2 1000..9999 +\def\@@magyar@ezer#1#2.{% + \ifnum#1#2>9999 sokadik\else + \@@magyar@egyjegyu#1% + \ifnum#2=0 ezer\else + ezer\ifnum#1>1 -\fi% ktezer-harmadik + \ifnum#2<100 + \expandafter\@@magyar@tiz\number#2% + \else + \ifnum#2<200 egy\fi% ezerszzadik -> ezeregyszzadik + \@@magyar@szaz#2% + \fi + \fi + \fi +} +%** @param #1#2 100..999 +%** Imp: binary search +\def\@@magyar@szaz#1#2#3{% + \@@magyar@egyjegyu#1sz\'az% + \@@magyar@tiz#2#3% +} +%** @param #1 a digit +%** @param #2 a digit +%** Imp: binary search +\def\@@magyar@tiz#1#2{% + \ifnum#1#2>89 kilencven\@@magyar@egy#2% + \else\ifnum#1#2>79 nyolcvan\@@magyar@egy#2% + \else\ifnum#1#2>69 hetven\@@magyar@egy#2% + \else\ifnum#1#2>59 hatvan\@@magyar@egy#2% + \else\ifnum#1#2>49 \"otven\@@magyar@egy#2% + \else\ifnum#1#2>39 negyven\@@magyar@egy#2% + \else\ifnum#1#2>29 harminc\@@magyar@egy#2% + \else\ifnum#1#2>20 huszon\@@magyar@egy#2% + \else\ifnum#1#2=20 h\'usz% + \else\ifnum#1#2>10 tizen\@@magyar@egy#2% + \else\ifnum#1#2=10 t\'iz% + \else \@@magyar@egy#2% ``ktszzadik'' + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi +}% +\def\@@magyar@egy#1{% + \ifcase#1 \or egy\or kett\H{o}\or h\'arom\or n\'egy\or + \"ot\or hat\or h\'et\or nyolc\or kilenc\fi% +} +%** Same as \@hunumeral, but uppercase +\def\@Hunumeral#1{% + % Dat: \newlabel{hellopart}{{Els\H o}{3}} is correctly written out + \ifcase#1 Nulla\or Egy\or Kett\H{o}\or H\'arom\or N\'egy\or + \"Ot\or Hat\or H\'et\or Nyolc\or Kilenc\else\@@magyar@uppernum\@hunumeral{#1}\fi +} +\def\hunumeral#1{\expandafter\@hunumeral\csname c@#1\endcsname} +\def\Hunumeral#1{\expandafter\@Hunumeral\csname c@#1\endcsname} + +\@gobble +{^}% + +% --- Appending suffixes to numbers; told= + +\ifnum\magyar@opt@@told=0 \@@magyar@skiplong\fi +% Dat: double accent combinations: +adik,+a,+as,+ad +hoz,+an,+on,+at,+ban... + +% vvv Terminal suffix variants + +% Dat: meaning of classes(#1): {\ifcase 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or 9\or 10\or 11/-1\or 12/-2\or 100\or 1000\or 10^6\or 10^9\or 20\or 30\or 40\or 60\fi} +% Dat: ...@st is is special for appending +t to \refstruc names +\def\@@magyar@suffix@adik#1{\ifnum#1=1 s\H o\else + \ifcase#1 a\or e\or o\or a\or e\or\"o\or o\or e\or a\or e\or e\or e\or e\or a\or e\or a\or a\or a\or a\or e\or a\or e\or e\fi dik\fi}% +\def\@@magyar@suffix@a#1{\ifcase #1 a\or je\or a\or a\or e\or e\or a\or e\or a\or e\or e\or e\or e\or a\or e\or a\or a\or a\or a\or e\or a\fi}% +\def\@@magyar@suffix@as#1{\ifcase #1 \or e\or e\or a\or e\or\"o\or o\or e\or a\or e\or e\or e\or e\or a\or e\or \or a\or a\or a\or e\or a\fi s}% +\def\@@magyar@suffix@ad#1{\ifcase #1 a\or e\or e\or a\or e\or\"o\or o\or e\or a\or e\or e\or e\or e\or a\or e\or a\or a\or a\or a\or e\or a\fi d}% +\def\@@magyar@suffix@@hoz#1#2{\ifcase#2 o\or e\or\"o\or o\or e\or\"o\or o\or e\or o\or e\or e\or e\or\"o\or o\or e\or o\or o\or o\or o\or e\or o\fi#1}% +\def\@@magyar@suffix@@an#1{\ifcase #1 \or e\or e\or a\or e\or e\or a\or e\or a\or e\or e\or e\or e\or a\or e\or a\or a\or a\or a\or e\or a\fi n}% +\def\@@magyar@suffix@on#1{\ifcase #1 \or e\or \or o\or e\or\"o\or o\or e\or a\or e\or e\or e\or e\or o\or e\or \or o\or o\or o\or e\or o\fi n}% +\def\@@magyar@suffix@st#1{\ifcase #1 \or \or \or \or e\or \or \or \or \or \or \or \or \or \or \or \or \or \or \or \or \fi t}% +\def\@@magyar@suffix@@at#1{\ifcase #1 \or e\or \or a\or e\or\"o\or o\or e\or a\or e\or e\or e\or \or a\or e\or \or a\or a\or a\or e\or a\fi t}% +\def\@@magyar@suffix@@a#1#2{\ifcase #2 a\or e\or e\or a\or e\or e\or a\or e\or a\or e\or e\or e\or e\or a\or e\or a\or a\or a\or a\or e\or a\fi#1}% +\def\@@magyar@suffix@nal#1{n\ifcase #1 \'a\or \'e\or \'e\or\'a\or \'e\or \'e\or\'a\or \'e\or\'a\or \'e\or \'e\or \'e\or \'e\or\'a\or \'e\or \'a\or \'a\or \'a\or\'a\or \'e\or\'a\fi l}% +\def\@@magyar@suffix@@ol#1{\ifcase #1 \'o\or\H o\or\H o\or\'o\or\H o\or\H o\or\'o\or\H o\or\'o\or\H o\or\H o\or\H o\or\H o\or\'o\or\H o\or \'o\or \'o\or \'o\or\'o\or\H o\or\'o\fi l}% +\def\@@magyar@suffix@ul#1{\ifcase #1 u\or \"u\or \"u\or u\or \"u\or \"u\or u\or \"u\or u\or \"u\or \"u\or \"u\or \"u\or u\or \"u\or u\or u\or u\or u\or \"u\or u\fi l}% +\def\@@magyar@suffix@val#1{\ifcase #1 va\or gye\or ve\or ma\or gye\or te\or ta\or te\or ca\or ce\or ze\or gye\or ve\or za\or re\or va\or da\or sza\or ca\or ne\or na\fi l}% +% @example: \atold(2.31)+es+sel{} +\def\@@magyar@suffix@sal#1{\ifcase #1 sa\or se\or se\or sa\or se\or se\or sa\or se\or sa\or se\or se\or se\or se\or sa\or se\or sa\or sa\or sa\or sa\or se\or sa\fi l}% +% @example: \atold(2.31)+ed+del{} +\def\@@magyar@suffix@dal#1{\ifcase #1 da\or de\or de\or da\or de\or de\or da\or de\or da\or de\or de\or de\or de\or da\or de\or da\or da\or da\or da\or de\or da\fi l}% +% @example: \atold(2.31)+edik+kel{} +\def\@@magyar@suffix@kal#1{\ifcase #1 ka\or ke\or ke\or ka\or ke\or ke\or ka\or ke\or ka\or ke\or ke\or ke\or ke\or ka\or ke\or ka\or ka\or ka\or ka\or ke\or da\fi l}% +\def\@@magyar@suffix@an{\@@magyar@suffix@@an}% make \ifx\@@magyar@suffix@an faster +\def\@@magyar@suffix@at{\@@magyar@suffix@@at}% make \ifx\@@magyar@suffix@at faster +\def\@@magyar@suffix@hoz{h\@@magyar@suffix@@hoz z} +\def\@@magyar@suffix@ban{b\@@magyar@suffix@@a n} +\def\@@magyar@suffix@nak{n\@@magyar@suffix@@a k} +\def\@@magyar@suffix@ba{b\@@magyar@suffix@@a \@empty} +\def\@@magyar@suffix@ra{r\@@magyar@suffix@@a \@empty} +\def\@@magyar@suffix@bol{b\@@magyar@suffix@@ol} +\def\@@magyar@suffix@tol{t\@@magyar@suffix@@ol} +\def\@@magyar@suffix@rol{r\@@magyar@suffix@@ol} +\def\@@magyar@suffix@szor{sz\@@magyar@suffix@@hoz r} + +% vvv Continued suffix variants + +\def\@@magyar@skipfi\fi\else{\fi}% +%** Usage: \@@magyar@suffix@aS{5}\magyar@@suffix@hoz +\def\@@magyar@suffix@aS#1#2{% + \ifnum#2=5 \ifx#1\@@magyar@suffix@at \"oset\else\@@magyar@skipfi\fi\else + \ifcase#2 \or e\or e\or a\or e\or \"o\or o\or e\or a\or e\or e\or e\or e\or a\or e\or \or a\or a\or a\or e\or a\fi s% + \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter + \ifx#1\@@magyar@suffix@val\@@magyar@suffix@sal\else#1\fi % +es+vel -> +es+sel + % Imp: +ad+val, +adik+val etc. + \ifcase#2 3\or 1\or 1\or 3\or 1\or 5\or 3\or 1\or 3\or 1\or 1\or 1\or 1\or 3\or 1\or 3\or 3\or 3\or 3\or 1\or 3\fi + \fi +}% +\def\@@magyar@suffix@aD#1#2{% + \ifcase#2 \or e\or e\or a\or e\or \"o\or o\or e\or a\or e\or e\or e\or e\or a\or e\or \or a\or a\or a\or e\or a\fi d% + \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter + \ifx#1\@@magyar@suffix@val\@@magyar@suffix@dal\else#1\fi % +ed+vel -> +ed+del + \ifcase#2 3\or 1\or 1\or 3\or 1\or 5\or 3\or 1\or 3\or 1\or 1\or 1\or 1\or 3\or 1\or 3\or 3\or 3\or 3\or 1\or 3\fi +}% +\def\@@magyar@suffix@adiK#1#2{% + \ifnum#2=1 \ifx#1\@@magyar@suffix@at s\"ot\else\@@magyar@skipfi\fi\else + \ifcase#2 \or e\or e\or a\or e\or \"o\or o\or e\or a\or e\or e\or e\or e\or a\or e\or \or a\or a\or a\or e\or a\fi dik% + \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter + \ifx#1\@@magyar@suffix@val\@@magyar@suffix@kal\else#1\fi % +edik+vel -> +ed+kel + \ifcase#2 3\or 1\or 1\or 3\or 1\or 1\or 3\or 1\or 3\or 1\or 1\or 1\or 1\or 3\or 1\or 3\or 3\or 3\or 3\or 1\or 3\fi + \fi +}% +\def\@@magyar@suffix@A#1#2{% + \ifcase#2 \'a\or j\'e\or \'a\or \'a\or \'e\or \'e\or \'a\or \'e\or \'a\or \'e\or \'e\or \'e\or \'e\or \'a\or \'e\or \'a\or\'a\or\'a\or\'a\or\'e\or\'a\fi + \ifx#1\@@magyar@suffix@at t\else + \ifx#1\@@magyar@suffix@an n\else% Dat: suffix overload: 2-a-an => 2-n + \expandafter#1\ifcase#2 3\or 1\or 1\or 3\or 1\or 1\or 3\or 1\or 3\or 1\or 1\or 1\or 1\or 3\or 1\or 3\or 3\or 3\or 3\or 1\or 3\fi + \fi\fi +}% +\def\@@magyar@suffix@@bad#1#2{\@@magyar@error{Unknown suffix \string`#1' for \string\told}} + +% vvv Input suffix parser + +%** Also defined elsewhere. +%** @param #2 \else...\else...\fi...\fi etc. +\def\@@magyar@swaprelax#1#2\relax{#2#1} +%\def\@@magyar@swapno#1\noexpand{...} +\def\@@magyar@contn#1\relax{#1\@@magyar@told@cont{}} +\def\@@magyar@conta#1#2#3\relax{#3\noexpand#1\@@magyar@told@cont{#2}} +\def\@@magyar@badsuffix#1#2\relax{#2\noexpand\@@magyar@suffix@@bad{#1}\@@magyar@told@cont{#1}}% +\def\@@magyar@fs@#1{% + \if a\noexpand#1\@@magyar@swaprelax\@@magyar@fs@a\else + \if b\noexpand#1\@@magyar@swaprelax\@@magyar@fs@b\else + \if d\noexpand#1\@@magyar@swaprelax\@@magyar@fs@d\else + \if e\noexpand#1\@@magyar@swaprelax\@@magyar@fs@e\else + \if h\noexpand#1\@@magyar@swaprelax\@@magyar@fs@h\else + \if k\noexpand#1\@@magyar@swaprelax\@@magyar@fs@k\else + \if n\noexpand#1\@@magyar@swaprelax\@@magyar@fs@n\else + \if o\noexpand#1\@@magyar@swaprelax\@@magyar@fs@o\else + \if r\noexpand#1\@@magyar@swaprelax\@@magyar@fs@r\else + \if s\noexpand#1\@@magyar@swaprelax\@@magyar@fs@s\else + \if t\noexpand#1\@@magyar@swaprelax\@@magyar@fs@t\else + \if u\noexpand#1\@@magyar@swaprelax\@@magyar@fs@u\else + \if v\noexpand#1\@@magyar@swaprelax\@@magyar@fs@v\else + % Imp: SUXX: badsuffix doesn't work for +qal here -- fix error reporting + \@@magyar@badsuffix{#1}{}\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax +} +\def\@@magyar@fs@a#1{% + %\if -\noexpand#1\@@magyar@swapno\else + \if +\noexpand#1\noexpand\@@magyar@suffix@A\@@magyar@swaprelax\@@magyar@fs@\else + \if d\noexpand#1\@@magyar@swaprelax\@@magyar@fs@ad\else + \if n\noexpand#1\noexpand\@@magyar@suffix@an\@@magyar@contn\else + \if s\noexpand#1\@@magyar@swaprelax\@@magyar@fs@as\else + \if t\noexpand#1\noexpand\@@magyar@suffix@at\@@magyar@contn\else + \@@magyar@conta\@@magyar@suffix@a{#1}% + \fi\fi\fi\fi\fi\relax +} +\def\@@magyar@fs@ad#1{% + %\if -\noexpand#1\@@magyar@swapno\else + \if +\noexpand#1\noexpand\@@magyar@suffix@aD\@@magyar@swaprelax\@@magyar@fs@\else + \if i\noexpand#1\@@magyar@swaprelax\@@magyar@fs@adi\else + \@@magyar@conta\@@magyar@suffix@ad{#1}% + \fi\fi\relax +} +\def\@@magyar@fs@adi#1{% + \if k\noexpand#1\@@magyar@swaprelax\@@magyar@fs@adik\else + \@@magyar@badsuffix{adi#1}{}\fi\relax +} +\def\@@magyar@fs@adik#1{% + %\if -\noexpand#1\@@magyar@swapno\else + \if +\noexpand#1\noexpand\@@magyar@suffix@adiK\@@magyar@swaprelax\@@magyar@fs@\else + \@@magyar@conta\@@magyar@suffix@adik{#1}% + \fi\relax +} +\def\@@magyar@fs@as#1{% + %\if -\noexpand#1\@@magyar@swapno\else + \if +\noexpand#1\noexpand\@@magyar@suffix@aS\@@magyar@swaprelax\@@magyar@fs@\else + \@@magyar@conta\@@magyar@suffix@as{#1}% + \fi\relax +} +\def\@@magyar@fs@b#1{% + \if a\noexpand#1\@@magyar@swaprelax\@@magyar@fs@ba\else + \if e\noexpand#1\@@magyar@swaprelax\@@magyar@fs@ba\else + \if o\noexpand#1\@@magyar@swaprelax\@@magyar@fs@bo\else + \@@magyar@badsuffix{b#1}{}\fi\fi\fi\relax +} +\def\@@magyar@fs@ba#1{% + \if n\noexpand#1\noexpand\@@magyar@suffix@ban\@@magyar@contn\else + \@@magyar@conta\@@magyar@suffix@ba{#1}% + \fi\relax +} +\def\@@magyar@fs@bo#1{% + \if l\noexpand#1\noexpand\@@magyar@suffix@bol\@@magyar@contn\else + \@@magyar@badsuffix{bo#1}{}\fi\relax +} +\def\@@magyar@fs@d#1{% + \if a\noexpand#1\@@magyar@swaprelax\@@magyar@fs@da\else + \if e\noexpand#1\@@magyar@swaprelax\@@magyar@fs@da\else + \@@magyar@badsuffix{d#1}{}\fi\fi\relax +} +\def\@@magyar@fs@da#1{% + \if l\noexpand#1\noexpand\@@magyar@suffix@dal\@@magyar@contn\else + \@@magyar@badsuffix{da#1}{}\fi\relax +} +\def\@@magyar@fs@e#1{% + \if d\noexpand#1\@@magyar@swaprelax\@@magyar@fs@ad\else + \if s\noexpand#1\@@magyar@swaprelax\@@magyar@fs@as\else + \if t\noexpand#1\noexpand\@@magyar@suffix@at\@@magyar@contn\else + \if n\noexpand#1\noexpand\@@magyar@suffix@an\@@magyar@contn\else + \if +\noexpand#1\noexpand\@@magyar@suffix@A\@@magyar@swaprelax\@@magyar@fs@\else + %\@@magyar@badsuffix{e#1}{} + \@@magyar@conta\@@magyar@suffix@a{#1}{}% + \fi\fi\fi\fi\fi\relax +} +\def\@@magyar@fs@h#1{% + \if e\noexpand#1\@@magyar@swaprelax\@@magyar@fs@ho\else + \if o\noexpand#1\@@magyar@swaprelax\@@magyar@fs@ho\else + \@@magyar@badsuffix{h#1}{}\fi\fi\relax +} +\def\@@magyar@fs@ho#1{% + \if z\noexpand#1\noexpand\@@magyar@suffix@hoz\@@magyar@contn\else + \@@magyar@badsuffix{ho#1}{}\fi\relax +} +\def\@@magyar@fs@k#1{% + \if a\noexpand#1\@@magyar@swaprelax\@@magyar@fs@ka\else + \if e\noexpand#1\@@magyar@swaprelax\@@magyar@fs@ka\else + \@@magyar@badsuffix{k#1}{}\fi\fi\relax +} +\def\@@magyar@fs@ka#1{% + \if l\noexpand#1\noexpand\@@magyar@suffix@kal\@@magyar@contn\else + \@@magyar@badsuffix{ka#1}{}\fi\relax +} +\def\@@magyar@fs@n#1{% + \if a\noexpand#1\@@magyar@swaprelax\@@magyar@fs@na\else + \if e\noexpand#1\@@magyar@swaprelax\@@magyar@fs@na\else + \@@magyar@badsuffix{n#1}{}\fi\fi\relax +} +\def\@@magyar@fs@na#1{% + \if k\noexpand#1\noexpand\@@magyar@suffix@nak\@@magyar@contn\else + \if l\noexpand#1\noexpand\@@magyar@suffix@nal\@@magyar@contn\else + \@@magyar@badsuffix{na#1}{}\fi\fi\relax +} +\def\@@magyar@fs@o#1{% + \if d\noexpand#1\@@magyar@swaprelax\@@magyar@fs@ad\else + \if n\noexpand#1\noexpand\@@magyar@suffix@on\@@magyar@contn\else + \if s\noexpand#1\@@magyar@swaprelax\@@magyar@fs@as\else + \if t\noexpand#1\noexpand\@@magyar@suffix@at\@@magyar@contn\else + \@@magyar@badsuffix{o#1}{}\fi\fi\fi\fi\relax +} +\def\@@magyar@fs@r#1{% + \if a\noexpand#1\noexpand\@@magyar@suffix@ra\@@magyar@contn\else + \if e\noexpand#1\noexpand\@@magyar@suffix@ra\@@magyar@contn\else + \if o\noexpand#1\@@magyar@swaprelax\@@magyar@fs@ro\else + \@@magyar@badsuffix{r#1}{}\fi\fi\fi\relax +} +\def\@@magyar@fs@ro#1{% + \if l\noexpand#1\noexpand\@@magyar@suffix@rol\@@magyar@contn\else + \@@magyar@badsuffix{ro#1}{}\fi\relax +} +\def\@@magyar@fs@s#1{% + \if z\noexpand#1\@@magyar@swaprelax\@@magyar@fs@sz\else + \if a\noexpand#1\@@magyar@swaprelax\@@magyar@fs@sa\else + \if e\noexpand#1\@@magyar@swaprelax\@@magyar@fs@sa\else + \if t\noexpand#1\noexpand\@@magyar@suffix@st\@@magyar@contn\else + \@@magyar@badsuffix{s#1}{}\fi\fi\fi\fi\relax +} +\def\@@magyar@fs@sa#1{% + \if l\noexpand#1\noexpand\@@magyar@suffix@sal\@@magyar@contn\else + \@@magyar@badsuffix{sa#1}{}\fi\relax +} +\def\@@magyar@fs@sz#1{% + \if o\noexpand#1\@@magyar@swaprelax\@@magyar@fs@szo\else + \if e\noexpand#1\@@magyar@swaprelax\@@magyar@fs@szo\else + \@@magyar@badsuffix{sz#1}{}\fi\fi\relax +} +\def\@@magyar@fs@szo#1{% + \if r\noexpand#1\noexpand\@@magyar@suffix@szor\@@magyar@contn\else + \@@magyar@badsuffix{szo#1}{}\fi\relax +} +\def\@@magyar@fs@t#1{% + \if o\noexpand#1\@@magyar@swaprelax\@@magyar@fs@to\else% Dat: works even if #1 is empty + \@@magyar@conta\@@magyar@suffix@at{#1}% + \fi\relax +} +\def\@@magyar@fs@to#1{% + \if l\noexpand#1\noexpand\@@magyar@suffix@tol\@@magyar@contn\else + \@@magyar@badsuffix{to#1}{}\fi\relax +} +\def\@@magyar@fs@u#1{% + \if l\noexpand#1\noexpand\@@magyar@suffix@ul\@@magyar@contn\else + \@@magyar@badsuffix{u#1}{}\fi\relax +} +\def\@@magyar@fs@v#1{% + \if a\noexpand#1\@@magyar@swaprelax\@@magyar@fs@va\else + \if e\noexpand#1\@@magyar@swaprelax\@@magyar@fs@va\else + \@@magyar@badsuffix{v#1}{}\fi\fi\relax +} +\def\@@magyar@fs@va#1{% + \if l\noexpand#1\noexpand\@@magyar@suffix@val\@@magyar@contn\else + \@@magyar@badsuffix{va#1}{}\fi\relax +} + +% vvv Classification + +% Old: \def\@@magyar@skipor#1\or#2\fi{\fi#1}% +%** Usage: \expandafter\@@magyar@skipor\expandafter\token\ifcase ... \else ... \or\else\fi +\def\@@magyar@skipor#1\or{\@@magyar@skipelse#1\else}% +\def\@@magyar@skipelse#1\else#2\fi{\fi#1}% + +%** Usage: \@@magyar@classify@none{N}{...} +%** Reads till \vfuzz, considers the last decimal number, ignores space, +%** punctuation and the minus `-' sign. Ignores spaces, so `1 2' and `12' are +%** treated the same number. There must ne no `{' or `}' inside `...'. +%** x ends by 0..9, y ends by 1..9 below. +%** @expands to: +%** c0: 0 +%** c1: 1 +%** c2: x2 ... +%** c9: x9 +%** c10: x10 +%** c11: x1 +%** c12: x2 +%** c13: y00 +%** c14: y000 y0000 y00000 +%** c15: y000000 y0000000 y00000000 +%** c16: x000000000 +%** c17: x20 +%** c18: x30 +%** c19: x40 x50 x70 x90 +%** c20: x60 x80 +%** On error, expansion doesn't start with `c' +%** @param #1 default classification, if no (more) numbers found +%** @param #2 next token +\def\@@magyar@classify@none#1#2{% + \if\noexpand#20\@@magyar@swaprelax{\@@magyar@classify@none{c0}}\else + % Dat: smart way to test whether #1 is in 1..9: \ifnum0<0\string#1 foo\fi + \ifnum0<0\string#2 \@@magyar@swaprelax{\@@magyar@classify@single#2}\else + \if\noexpand#2- \@@magyar@swaprelax{\@@magyar@classify@neg{#1}}\else + \ifx#2\vfuzz \@@magyar@swaprelax{#1}\else% stop processing if terminating \vfuzz is found + \@@magyar@swaprelax{\@@magyar@classify@none{#1}}% find next (possibly) number + % ^^^ Dat: it is safe to call \@@magyar@swaprelax here, even if #2 contains \relax + \fi\fi\fi\fi\relax +} +\def\@@magyar@classify@neg#1#2{% + \if\noexpand#20\@@magyar@swaprelax{\@@magyar@classify@none{c0}}\else + % Dat: smart way to test whether #1 is in 1..9: \ifnum0<0\string#1 foo\fi + \ifnum0<0\string#2 \@@magyar@swaprelax{\@@magyar@classify@singleneg#2}\else + \if\noexpand#2- \@@magyar@swaprelax{\@@magyar@classify@none{#1}}\else% double negation + \ifx#2\vfuzz \@@magyar@swaprelax{#1}\else% stop processing if terminating \vfuzz is found + \@@magyar@swaprelax{\@@magyar@classify@none{#1}}% find next (possibly) number, start as positive + % ^^^ Dat: it is safe to call \@@magyar@swaprelax here, even if #2 contains \relax + \fi\fi\fi\fi\relax +} +%** @param #1 previous digit 1..9 +%** @param #2 next token +\def\@@magyar@classify@single#1#2{% + \if\noexpand#20\@@magyar@swaprelax{\@@magyar@classify@tens#1}\else + \ifnum0<0\string#2 \@@magyar@swaprelax{\@@magyar@classify@more#2}\else + \ifx#2\vfuzz \@@magyar@swaprelax{c#1}\else + \@@magyar@swaprelax{\@@magyar@classify@none{c#1}#2}% + % ^^^ Dat: it is safe to call \@@magyar@swaprelax here, even if #2 contains \relax + \fi\fi\fi\relax +} +%** @param #1 previous digit 1..9 +%** @param #2 next token +\def\@@magyar@classify@singleneg#1#2{% + \if\noexpand#20\@@magyar@swaprelax{\@@magyar@classify@tens#1}\else + \ifnum0<0\string#2 \@@magyar@swaprelax{\@@magyar@classify@more#2}\else + \ifx#2\vfuzz \@@magyar@swaprelax{c\ifcase#1 0\or11\or12\else#1\fi}\else % turn `-1' -> `11' and `-2' to `12' + \if#11\@@magyar@swaprelax{\@@magyar@classify@neg{c11}#2}\else + \if#12\@@magyar@swaprelax{\@@magyar@classify@neg{c12}#2}\else + \@@magyar@swaprelax{\@@magyar@classify@neg{c#1}#2}% + % ^^^ Dat: it is safe to call \@@magyar@swaprelax here, even if #2 contains \relax + \fi\fi\fi\fi\fi\relax +} +%** @param #1 previous digit 1..9 +%** @param #2 next token +\def\@@magyar@classify@more#1#2{% + \if\noexpand#20\@@magyar@swaprelax{\@@magyar@classify@tens#1}\else + \ifnum0<0\string#2 \@@magyar@swaprelax{\@@magyar@classify@more#2}\else + \@@magyar@swaprelax{% + \expandafter\@@magyar@skipor\expandafter\@@magyar@classify@none + \ifcase#1 M\or {c11}\or {c12}\else {c#1}\or\else\fi#2}% + % ^^^ Dat: it is safe to call \@@magyar@swaprelax here, even if #2 contains \relax + \fi\fi\relax +} +%** @param #1 prev-prev digit, 1..9 +%** @param #2 next token +\def\@@magyar@classify@tens#1#2{% + \if\noexpand#20\@@magyar@swaprelax{\@@magyar@classify@zeroes2}\else + \ifnum0<0\string#2 \@@magyar@swaprelax{\@@magyar@classify@more#2}\else + \@@magyar@swaprelax{% + \expandafter\@@magyar@skipor\expandafter\@@magyar@classify@none + \ifcase#1 T\or{c10}\or{c17}\or{c18}\or{c19}\or{c19}\or{c20}\or{c19}\or{c20}\else{c19}\or\else\fi#2}% + % ^^^ Dat: it is safe to call \@@magyar@swaprelax here, even if #2 contains \relax + \fi\fi\relax +} +%** @param #1 zero-count 2..9 +%** @param #2 next token +\def\@@magyar@classify@zeroes#1#2{% + \if\noexpand#20\@@magyar@swaprelax{% + %\def\foo#1,{.(#1)} + %\message{\expandafter\expandafter\expandafter\foo\expandafter + % \@@magyar@skipor\ifcase3 zero\or one\or two\else three\or\fi,done} + \expandafter\@@magyar@skipor\expandafter\@@magyar@classify@zeroes + %\ifcase#1 Y\or Y\or 3\or 4\or 5\or 6\or 7\or 8\or 9\or 9\or% Dat: no \else + \ifcase#1 Y\or Y\or 3\or 4\or 5\or 6\or 7\or 8\else 9% + \or\else\fi}\else% ^^^ Dat: 2 -> 3 ... 8 -> 9, 9 -> 9 + \ifnum0<0\string#2 \@@magyar@swaprelax{\@@magyar@classify@more#2}\else + \@@magyar@swaprelax{% + \expandafter\@@magyar@skipor\expandafter\@@magyar@classify@none + \ifcase#1 Z\or Z\or {c13}\or {c14}\or {c14}\or {c14}\or {c15}\or {c15}\or + {c15}\else {c16}\or\else\fi#2}% + % ^^^ Dat: it is safe to call \@@magyar@swaprelax here, even if #2 contains \relax + \fi\fi\relax +} + +% vvv The user interface for suffixing + +\def\@@magyar@ccheck#1#2\vfuzz#3{% + \if\noexpand#1c\relax\else + \@@magyar@error{\string\told\space needs number, not \string`#3'}% + \def\reserved@a{c0}% + \fi +} + +%** Expands #1 with \the if it is \cs (possibly \count or \toks etc.) +\def\@@magyar@the#1{% + \ifx#1\relax\else\if\noexpand\noexpand\noexpand#1% + \expandafter\expandafter\expandafter\the\fi\fi#1% +}% + +\def\@@magyar@firsthfuzz#1#2\hfuzz{#1} +\def\@@magyar@secondhfuzz#1#2#3\hfuzz{#2} +%** See docs in magyar.dtx +\def\@@magyar@zerocite#1{% + \ifx[#1\expandafter\@secondoftwo\fi\@thirdofthree\@firstoftwo + {\@@magyar@zerocite@lowa[, }% had `[' + {\@@magyar@zerocite@lowa[]{#1}}% +} +\def\@@magyar@zerocite@lowa[#1]#2{[\@@magyar@zerocite@lowb#2,\hbox,${#1}} +\def\@@magyar@swapvfuzz#1#2\vfuzz{#2#1} +\def\@@magyar@zerocite@lowb#1#2,{% + \ifx\hfuzz#1\hfuzz + \else\ifx\hbox#1\@@magyar@swapvfuzz\@@magyar@zerocite@lowc + \else\ifx,#1\@@magyar@swapvfuzz\@@magyar@zerocite@lowb{#2,}% + \else\expandafter\ifx\csname b@#1#2\endcsname\relax + 0, \@@magyar@swapvfuzz\@@magyar@zerocite@lowb + \else\expandafter\expandafter\expandafter\@@magyar@b@number + \expandafter\expandafter\expandafter{\csname b@#1#2\endcsname}, + \@@magyar@swapvfuzz\@@magyar@zerocite@lowb + \fi\fi\fi\fi\vfuzz} +\def\@@magyar@zerocite@lowc$#1{]#1} + +%** Expands to the numeric value of a \b@foobar definition +%** Dat: with natbib.sty, we get \def\b@foobar{{1}{...}...}, +%** otherwise something like \def\b@foobar{\... 1} +%** @param #1 value of a \b@foobar +\def\@@magyar@b@number{% + \expandafter\ifx\csname ver@natbib.sty\endcsname\relax + \expandafter\@firstofone + \else \expandafter\@@magyar@b@number@natbibone \fi +} +\def\@@magyar@b@number@natbibone#1{\@@magyar@b@number@natbibtwo#1.\vfuzz} +\def\@@magyar@b@number@natbibtwo#1#2\vfuzz{#1}% + +\def\@@magyar@zeroaref#1{% + % Dat: we cannot use \@ifnextchar here, because it is not expandable + \ifx(#1\expandafter\@secondoftwo\fi\@thirdofthree\@firstoftwo + {\@@magyar@zeroref}{% Dat: gobble the ( + \ifx*#1\expandafter\@secondoftwo\fi\@thirdofthree\@firstoftwo + {\NotAllowedArefStar\@@magyar@zeropageref}% Dat: gobble the * + {\@@magyar@zeroref{#1}}% + {\@@magyar@zeroref{#1}}}% +} + +\def\@@magyar@zeroapageref#1{% + % Dat: we cannot use \@ifnextchar here, because it is not expandable + \ifx*#1\expandafter\@secondoftwo\fi\@thirdofthree\@firstoftwo + {\NotAllowedApagerefStar\@@magyar@zeropageref}% Dat: gobble the * + {\@@magyar@zeropageref{#1}}% +} + +\def\@@magyar@zeroref#1{% + \expandafter\ifx\csname r@#1\endcsname\relax0\else + \expandafter\expandafter\expandafter\@@magyar@firsthfuzz\csname r@#1\endcsname00\hfuzz + \fi +}% +\def\@@magyar@zeroeqref#1{(\@@magyar@zeroref{#1})}% +\def\@@magyar@zerorefplus#1{\@@magyar@zerorefplus@low#1+\vfuzz} +\def\@@magyar@zerorefplus@low#1+#2\vfuzz{% + \expandafter\ifx\csname r@#1\endcsname\relax0\else + \expandafter\expandafter\expandafter\@@magyar@firsthfuzz\csname r@#1\endcsname00\hfuzz + \fi +}% +\def\@@magyar@zeropageref#1{% + \expandafter\ifx\csname r@#1\endcsname\relax0\else + \expandafter\expandafter\expandafter\@@magyar@secondhfuzz\csname r@#1\endcsname00\hfuzz + \fi +}% + +%** A space might be discared after the suffix, depending on the suffix. So +%** please use `\told5+adik{} ' to ensure the space. +%** May raise `! Package magyar.ldf Error: Unknown suffix `...' for \told', but +%** emits unchanged suffix to DVI file. +%** \atold\apageref emits double article +%** \cite, \acite etc. is allowed, but without comma +%** \aref({...}), \aref*, \apageref*, \acite* aren't allowed +%** \refstruc doesn't work inside it, because \refstruc isn't expandable +%** @example \told4+a+a+a+a+adik raises strange error +%** @example no -en is provided for -an/-on, to avoid ambiguity +%** @example \told4+adik: 0-adik 1-s 2-odik 3-adik 12-edik 10^8-adik +%** @example augusztus \told20-a: 1-je 2-a 3-a 4-e 5-e 6-a ... (augusztus 20-a) +%** @example \told3+as: 0-s(??) 1-es 2-es 3-as 4-es 5-s 10^6-s +%** @example \told0+ad: 0-ad 1-ed 2-ed 3-ad 5-d 10^6-ad +%** @example \told1000+hoz: 0-hoz 3-hoz 6-hoz 8-hoz 100-hoz 10^6-hoz 10^9-hoz 1-hez 4-hez 7-hez 9-hez 10-hez 1000-hez 2-hz 5-hz +%** @example \told5+an: 5-en 2-en 100-an 10^6-n +%** @example \told5+on: 5-n 2-n 3-on 100-on 10^6-n +%** @example \told0+at: 0-t 2-t 10^6-t 1-et 4-et 7-et 9-et 10-et 1000-et 3-at 8-at 6-ot 10^9-ot 5-t +%** @example \told1000+ban: 1000-ben +%** @example \told7+ba: 7-be +%** @example \told5+nak: 7-nek +%** @example \told2+ra: 2-re +%** @example \told4+nal: 4-nl +%** @example \told7+bol: 7-bl +%** @example \told5+tol: 5-tl +%** @example \told3+rol: 3-rl +%** @example \told2+ul: 0-ul 1-l 2-l 3-ul +%** @example \told5+odik+hoz +%** @example \told{300}+szor +%** @example -i and -ig don't change have alternate forms +%** @param #1 something that expands to an integer, or `\count...' or `\toks...' +\DeclareRobustCommand \@@magyar@told{\@@magyar@xtold 0} +\DeclareRobustCommand\@@magyar@atold{\@@magyar@xtold a} +\DeclareRobustCommand\@@magyar@Atold{\@@magyar@xtold A} +\def\@@magyar@xtold#1#2+{\@@magyar@told@low{#2}#1} +%** @param #1 something that expands to an integer, or `\count...' or `\toks...' +%** @param #2 add \az? (0: no, a: lowercase A: uppercase) +\def\@@magyar@told@low#1#2{% + % Dat: a level of braces has already been stripped from #1 + % Dat: negative sign isn't important, because it is skipped by \@@magyar@classify@none + \begingroup\begingroup + \@safe@activestrue% allow active `:' inside labels + \let\@safe@activesfalse\@empty \let\@safe@activestrue\@empty% inside \b@... emitted by \cite + % vvv Dat: gobbles its arg and `-' below + % `\@@magyar@toldas{42}' must be the very end of #1 + \let\@@magyar@toldas\@gobbletwo + \let\-\relax +% \let\@@magyar@save@tilde~% + \let~\relax% influenced by \@safe@activestrue + \let\refstruc\relax \let\refstrucparen\relax + \let \ref\relax \let \pageref\relax \let \cite\relax % all unexpandable, even for \@@magyar@the + \let\aref\relax \let\apageref\relax \let\acite\relax + \let\Aref\relax \let\Apageref\relax \let\Acite\relax + \let\autoref\relax + \let\hbox\@firstofone % Make \hbox{...} work by removing the braces. TODO(pts): Make \hbox to...{...} work. + \let\@@magyar@told@optdot\@empty % The optional dot disappears. + %\set@display@protect% \string. Why?? doesn't seem to screw up \r + \set@typeset@protect% \relax. + \edef\reserved@c{#1-}% + \edef\reserved@c{\def\noexpand\reserved@c{\expandafter\@@magyar@the\reserved@c\@empty}}% `\expandafter' is here so `the' and `number' take place + % + \def\@@magyar@toldas##1{.##1.}% emit the number + \let\romannumeral\number + \def\refstruc##1{0}% + \def\refstrucparen##1{0}% + \let\@safe@activestrue\@empty% babel puts these inside \b@...: % Dat: \def\b@abook{\@safe@activesfalse 2}% (what is \@safe@actives??) + \let\@safe@activesfalse\@empty% \b@DuplanJauneau1986 ->\@safe@activesfalse 15 + \def\hyper@@link[##1]##2##3##4{##4}% Dat: \def\b@abook{\hyper@@link [cite]{}{cite.sokt}{2}}% with hyperref.sty % BUGFIX at Tue Nov 21 03:15:32 CET 2006 + % + \let\ref\@@magyar@zeroref + \let\pageref\@@magyar@zeropageref + \let\cite\@@magyar@zerocite + \let\eqref\@@magyar@zeroeqref + % + \let\aref\@@magyar@zeroaref \let\Aref\aref % Dat: supports \aref* and \aref( + \let\apageref\@@magyar@zeroapageref \let\Apageref\apageref % Dat: supports \apageref* and \apageref( + \let\acite\cite \let\Acite\acite + % + \let\autoref\ref% Dat: SUXX: ``section 1-gyel'' + \edef\reserved@a{#1}% + \edef\reserved@a{\expandafter\@@magyar@the\reserved@a\@empty}% `\expandafter' is here so `the' and `number' take place + %\let~\@@magyar@save@tilde% vvv for ~ below etc. + \if0#2\else + #2% a or A + % vvv Dat: we do \az with \romannumeral changed to \number + \expandafter\@@magyar@az@set\expandafter{\reserved@a}\hbox$% Dat: \reserved@a is already expanded, as required by \@@magyar@az@set + \nobreakspace% Dat: `~' is wrong here, it has been redefined !! + \fi + \edef\reserved@a{\noexpand\reserved@c\def\noexpand\reserved@a{\reserved@a}}% + % + \expandafter\expandafter\expandafter\endgroup\reserved@a% keep \reserved@a and \reserved@c + %%\show\reserved@a \show\reserved@c \show\@@magyar@toldas + % vvv Dat: shows friendly LaTeX error: \told{\refstruc{refstruc=}}+ban + \def\refstruc{\@@magyar@error{Cannot use \string\refstruc\space inside \string\told}\@@magyar@refstruc}% + \edef\reserved@a{\expandafter\@@magyar@classify@none\expandafter N\reserved@a\vfuzz}% + %%\show\reserved@a + \expandafter\@@magyar@ccheck\reserved@a..\vfuzz\reserved@c% + %\edef\reserved@a{{\ifcase\expandafter\@gobble\reserved@a\space 0\or1\or2\or + % 3\or4\or5\or6\or7\or8\or9\or10\or11\or12\or13\or14\or15\or16\or + % 8\or8\else 9\fi}}% 20->8 30->8 40->9 % no need for this anymore + \edef\reserved@a{{\number\expandafter\@gobble\reserved@a}}% keeps 17,18,19 for +val + \expandafter\edef\expandafter\reserved@b\expandafter{\if}.\fi\@@magyar@fs@ +} +\def\@@magyar@told@optdot{.} +%** @in \reserved@a is suffix classification in braces: {0}, {1} ... or {16} +%** @param #1 \@empty or a char token +\def\@@magyar@told@cont#1{% + \reserved@a% add the suffix class, example: {11} + #1%\if/\noexpand#1\else#1\fi% add extra char unless `/' + \if{.\fi}% close \edef\reserved@b opened in \@@magyar@told + % Now: example \reserved@b: \@@magyar@suffix@aS \@@magyar@suffix@sal {11} + % Now: example \reserved@b: \@@magyar@suffix@aS \@@magyar@suffix@val {11} + % Dat: \reserved@b is now like \@@magyar@suffix@A \@@magyar@suffix@ban + % vvv Dat: \aref in \reserved@c may modify \reserved@b, so we call it + % late by \expandafter + \expandafter\reserved@c% print the number and the hyphen + \reserved@b% print the suffix + \endgroup +} +% Dat: \told is an unused \cs in LaTeX and its standard packages +\ifnum\magyar@opt@@told>1 + \let \told\@@magyar@told + \let\atold\@@magyar@atold + \let\Atold\@@magyar@Atold +\else + \expandafter\ifx\csname told\endcsname\relax \let \told\@@magyar@told\fi + \expandafter\ifx\csname atold\endcsname\relax \let\atold\@@magyar@atold\fi + \expandafter\ifx\csname Atold\endcsname\relax \let\Atold\@@magyar@Atold\fi +\fi +\@gobble +{^}% + +% --- hutoday= + +% Dat: latex.ltx has \edef for \today, but we have \def +\def\SafeToday{\the\year/\two@digits{\the\month}/\two@digits{\the\day}:% + \two@digits{\the\count@}:\two@digits{\the\count2}} + +\ifnum\magyar@opt@@hutoday=0 \@namedef{date\CurrentOption}{\let\today\SafeToday}\@@magyar@skiplong\fi +%** Same as what latex.ltx has. Expansion doesn't change it, doesn't contain +%** accents. +\@namedef{date\CurrentOption}{% + \def\today{% + \number\year.~\ifcase\month\or + janu\'ar\or febru\'ar\or m\'arcius\or + \'aprilis\or m\'ajus\or j\'unius\or + j\'ulius\or augusztus\or szeptember\or + okt\'ober\or november\or december\fi + \space\number\day.\hbox{}}% + } +% vvv Dat: ondate... and \ontoday is specific to magyar.ldf +\@namedef{ondate\CurrentOption}{% + \number\year.~\ifcase\month\or janu\'ar\or febru\'ar\or m\'arcius\or + \'aprilis\or m\'ajus\or j\'unius\or j\'ulius\or augusztus\or szeptember\or + okt\'ober\or november\or december\fi\space\ifcase\day\or + 1-j\'en\or 2-\'an\or 3-\'an\or 4-\'en\or 5-\'en\or + 6-\'an\or 7-\'en\or 8-\'an\or 9-\'en\or 10-\'en\or + 11-\'en\or 12-\'en\or 13-\'an\or 14-\'en\or 15-\'en\or + 16-\'an\or 17-\'en\or 18-\'an\or 19-\'en\or 20-\'an\or + 21-\'en\or 22-\'en\or 23-\'an\or 24-\'en\or 25-\'en\or + 26-\'an\or 27-\'en\or 28-\'an\or 29-\'en\or 30-\'an\or + 31-\'en\fi} +\edef\reserved@a{% + \noexpand\addto\expandafter\noexpand\csname extras\CurrentOption\endcsname{% + \noexpand\babel@save\noexpand\ontoday + \let\noexpand\ontoday\expandafter\noexpand\csname ondate\CurrentOption\endcsname} +} +\reserved@a +\@gobble +{^}% + +% --- refstruc= + +\if0\magyar@opt@@refstruc \@@magyar@skiplong\fi +\def\@@magyar@nonumbers@skipa#1\@@magyar@nonumbers@s{#1\@@magyar@nonumbers@a} +%** Changes arabic and roman numbers to 1 or i, respectively. +%** Usage: \typeout{((\@@magyar@nonumbers@a 35.2.iv\hfuzz))} -> ((1.1.i)) +\def\@@magyar@nonumbers@a#1{% + \ifx#1\hfuzz \expandafter\@gobble + \else\if\noexpand#101% !! Imp: 1<1\string#1 + \else\if\noexpand#111% + \else\if\noexpand#121% + \else\if\noexpand#131% + \else\if\noexpand#141% + \else\if\noexpand#151% + \else\if\noexpand#161% + \else\if\noexpand#171% + \else\if\noexpand#181% + \else\if\noexpand#191% + \else\if\noexpand#1mi% + \else\if\noexpand#1di% + \else\if\noexpand#1ci% + \else\if\noexpand#1li% + \else\if\noexpand#1xi% + \else\if\noexpand#1vi% + \else\if\noexpand#1ii% + \else\if\noexpand#1MI% + \else\if\noexpand#1DI% + \else\if\noexpand#1CI% + \else\if\noexpand#1LI% + \else\if\noexpand#1XI% + \else\if\noexpand#1VI% + \else\if\noexpand#1II% + \else\noexpand#1\@@magyar@nonumbers@skipa + \fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi \fi + \@@magyar@nonumbers@s +} +\def\@@magyar@nonumbers@s#1{% + \ifx#1\hfuzz \expandafter\@gobble + \else\if\noexpand#10% + \else\if\noexpand#11% + \else\if\noexpand#12% + \else\if\noexpand#13% + \else\if\noexpand#14% + \else\if\noexpand#15% + \else\if\noexpand#16% + \else\if\noexpand#17% + \else\if\noexpand#18% + \else\if\noexpand#19% + \else\if\noexpand#1m% + \else\if\noexpand#1d% + \else\if\noexpand#1c% + \else\if\noexpand#1l% + \else\if\noexpand#1x% + \else\if\noexpand#1v% + \else\if\noexpand#1i% + \else\if\noexpand#1M% + \else\if\noexpand#1D% + \else\if\noexpand#1C% + \else\if\noexpand#1L% + \else\if\noexpand#1X% + \else\if\noexpand#1V% + \else\if\noexpand#1I% + \else\noexpand#1\@@magyar@nonumbers@skipa + \fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi \fi + \@@magyar@nonumbers@s +} + +\let\@@magyar@toldas\@gobble +\def\@@magyar@strucname@part{r\'esz\@@magyar@toldas{4}}% SUXX: may not contain \-; !! rsszel (vs. rszszel) +\def\@@magyar@strucname@chapter{fejezet\@@magyar@toldas{9}}% !! fejezettel +\def\@@magyar@strucname@appendix{f\"ug\-gel\'ek\@@magyar@toldas{4}}% !! fuggelekkel +\def\@@magyar@strucname@section{szakasz\@@magyar@toldas{20}}% +\def\@@magyar@strucname@subsection{al\-sza\-kasz\@@magyar@toldas{20}}% +\def\@@magyar@strucname@subsubsection{al\-al\-szakasz\@@magyar@toldas{20}}% +\def\@@magyar@strucname@subsubsubsection{al\-al\-al\-szakasz\@@magyar@toldas{20}}% +\def\@@magyar@strucname@paragraph{bekezd\'es\@@magyar@toldas{4}}% +\def\@@magyar@strucname@subparagraph{albekezd\'es\@@magyar@toldas{4}}% +\def\@@magyar@strucname@subsubparagraph{alalbekezd\'es\@@magyar@toldas{4}}% +\def\@@magyar@strucname@figure{\'ab\-ra\@@magyar@toldas{4}}% !! brban etc. +\def\@@magyar@strucname@table{t\'ab\-l\'azat\@@magyar@toldas{6}}% +\def\@@magyar@strucname@equation{egyenlet\@@magyar@toldas{7}}% +\def\@@magyar@strucname@footnote{l\'ab\-jegy\-zet\@@magyar@toldas{7}}% +\def\@@magyar@strucname@item{elem\@@magyar@toldas{4}}% !! elemmel etc. +\def\@@magyar@strucname@FancyVerbLine{sor\@@magyar@toldas{8}}% !! sorral +\def\@@magyar@strucname@theorem{t\'e-tel\@@magyar@toldas{4}}% !! ttellel + +%** Must be expandable. +%** @param #1 `section' etc. +%** @expands to its name in English +\def\@@magyar@strucname#1{#1} +%** @param #1 `section' etc. +%** @expands to its name in Hungarian +\def\@@magyar@strucname@hu#1{\csname @@magyar@strucname@#1\endcsname} + +%** Keeps only structure number, discards page number etc. +\def\@@magyar@refstruc@parse#1#2\vfuzz{% + \ifx\relax#1\let\reserved@a\relax + \else\def\reserved@a{#1}\fi +}% +%** Retrieves the structure name (arg #4) from arg 2 of a \newlabel emitted +%** by hyperref.sty. +%** @example \newlabel{fig:vonal}{{1}{1}{my title}{figure.1}{}} +%** \@namedef{r@fig:vonal}{{1}{1}{my title}{figure.1}{}} +%** -> extract `figure' to \reserved@c +\def\@@magyar@refstruc@parsehyname#1#2#3#4#5\vfuzz{% + \ifx\relax#1% + \else\expandafter\@@magyar@refstruc@parsehynamedot#4\vfuzz\fi +}% +\def\@@magyar@refstruc@parsehynamedot#1.#2\vfuzz{% + \expandafter\ifx\csname @@magyar@strucname@#1\endcsname\relax + \else\def\reserved@c{#1}\fi +} + +%** @param #1 name of a count register (e.g c@part) +\def\@@magyar@refstruc@setcnt#1{% + \expandafter\ifx\csname#1\endcsname\relax\expandafter\@tempcnta + \else\csname#1\endcsname\fi +}% + +%** @param #1 a label name +\def\@@magyar@refstruc@ref#1{% + \ref{#1}.~% +} + +%** May not touch \reserved@a +\def\@@magyar@refstruc@split#1+#2\vfuzz#3{% + \if\noexpand#30\else\@@magyar@refstruc@ref{#1}\fi + \ifx\vfuzz#2% + \textbf{??}% + \G@refundefinedtrue + \else + \begingroup + \@safe@activestrue% so active `:' etc. will work inside \csname... + \edef\reserved@c{\noexpand\@@magyar@refstruc@splitlow + \expandafter\ifx\csname r@#1\endcsname\relax\relax\else + \expandafter\noexpand\csname r@#1\endcsname\fi}% + % ^^^ Dat: would emit `undefined' instead of `\relax' w/o \ifx + \expandafter\endgroup\reserved@c{#2}% + \fi +} + +%** @param #1 csname \r@foo:bar +%** @param #2 suffix to add +\def\@@magyar@refstruc@splitlow#1#2{% + \ifx#1\relax + \textbf{??+#2}% + \G@refundefinedtrue + \else + \expandafter\@@magyar@refstruc@parse#1..\vfuzz% + \@@magyar@refstruc@work#1% + \let\@@magyar@save@m\-% + \let\-\relax + \let\@@magyar@toldas\relax + \edef\reserved@c{\expandafter\@@magyar@strucname\expandafter{\reserved@c}}% + \let\-\@@magyar@save@m + \let\@@magyar@suffix@at\@@magyar@suffix@st% fix the -t suffix + \ifx\reserved@b\@empty\else + \@@magyar@refstruc@splitb#2\vfuzz% strip `+' from the end of #2 + \fi + \fi +} + +\def\@@magyar@refstruc@splitb#1+\vfuzz{% + \expandafter\@@magyar@told\reserved@c+#1{}% fejezet -> fejezetben +} + +%** The +val suffix does not produce the desired result. +%** @param #1 \ref id or with \told +%** (@param #2 1 to prefix with 1\ref{...}.~' in Hungarian order) +%** @example \refstruc{sec:foo} +%** @example \refstruc{sec:foo+as+an} +%** May not touch \reserved@a +\def\@@magyar@refstruc@name#1{% + \begingroup + \begingroup + \@safe@activestrue% so active `:' etc. will work inside \csname... + \edef\reserved@c{\noexpand\@@magyar@refstruc@namelow + \expandafter\ifx\csname r@#1\endcsname\relax\relax\else + \expandafter\noexpand\csname r@#1\endcsname\fi}% + % ^^^ Dat: would emit `undefined' instead of `\relax' w/o \ifx + \expandafter\endgroup\reserved@c{#1}% +} + +%** @param #1 csname \r@foo:bar +%** @param #2 foo:bar +%** @param #3 1 to prefix with 1\ref{...}.~' in Hungarian order) +\def\@@magyar@refstruc@namelow#1#2#3{% + \ifx#1\relax + \@@magyar@refstruc@split#2+\vfuzz#3% ends by +suffix, needs \told + \else + \expandafter\@@magyar@refstruc@parse#1..\vfuzz% sets \reserved@a to ref target + %%\show\reserved@a% first arg of ref, i.e section number, eg. `1.2.3' -- or \relax + \if\noexpand#30\else + \begingroup% Dat: \ref might redefine \reserved@a, especially in hyperref.sty + \@@magyar@refstruc@ref{#2}\endgroup\fi + \@@magyar@refstruc@work#1% + \expandafter\@@magyar@strucname\expandafter{\reserved@c}% + \fi + \endgroup +} + +\def\@@magyar@appendix@chapapp{\appendixname}% + +%** Input is \reserved@a, output is \reserved@c +%** @param #1 the control sequence \r@foo:bar +\def\@@magyar@refstruc@work#1{% + \edef\reserved@a{\expandafter\@@magyar@nonumbers@a\reserved@a\hfuzz}% + %\expandafter\lowercase\expandafter{\expandafter\def\expandafter\reserved@a\expandafter{\reserved@a}}% + % ^^^ Dat: don't do lowercasing, deliberately. + % Imp: referring from \@alph sections such as the appendix + \@@magyar@refstruc@setcnt{c@part}1 + \@@magyar@refstruc@setcnt{c@chapter}1 + \@@magyar@refstruc@setcnt{c@section}1 + \@@magyar@refstruc@setcnt{c@subsection}1 + \@@magyar@refstruc@setcnt{c@subsubsection}1 + \@@magyar@refstruc@setcnt{c@subsubsubsection}1 + \@@magyar@refstruc@setcnt{c@paragraph}1 + \@@magyar@refstruc@setcnt{c@subparagraph}1 + \@@magyar@refstruc@setcnt{c@subsubparagraph}1 + \let\reserved@c\relax + \expandafter\@@magyar@refstruc@parsehyname#1....\vfuzz% + \ifx\reserved@c\relax% hyperref.sty and nameref.sty has helped us + \def\reserved@c{subsubparagraph}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{subparagraph}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{paragraph}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{subsubsubsection}\edef\reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{subsubsection}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{subsection}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{section}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{chapter}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{appendix}\edef \reserved@b{\expandafter\ifx\csname c@chapter\endcsname\relax\else\@Alph\c@chapter\fi}\ifx\reserved@a\reserved@b\else% Imp: do this without changing counters in \appendix + \def\reserved@c{part}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + %%\show\@chapapp \show\@@magyar@appendix@chapapp + \ifx\@chapapp\@@magyar@appendix@chapapp% we're in an appendix referring to a normal chapter + \def\thechapter{\@arabic\c@chapter}\fi + \def\reserved@c{subsubparagraph}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{subparagraph}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{paragraph}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{subsubsubsection}\edef\reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{subsubsection}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{subsection}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{section}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + \def\reserved@c{chapter}\edef \reserved@b{\csname the\reserved@c\endcsname}\ifx\reserved@a\reserved@b\else + % + \@latex@error{Unknown structure level for ref \string`\reserved@a'; + \reserved@b}\@ehc% + \def\reserved@c{??}% Dat: must be expandable + \let\reserved@b\@empty + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi +} + +\def\@@magyar@refstruc@hu#1{\@@magyar@refstruc@name{#1}1}% +% Imp: Undocumented: \refstrucparen can be used instead of \refstruc +% to format the section number inside parentheses. +\def\@@magyar@refstrucparen@hu#1{% + \begingroup + \def\@@magyar@refstruc@ref##1{\told(\ref{##1})+es{}~}% + \@@magyar@refstruc@name{#1}1% + \endgroup}% +\def\@@magyar@refstruc#1{\@@magyar@refstruc@name{#1}0~\ref{#1}}% +\def\@@magyar@refstrucparen#1{\@@magyar@refstruc@name{#1}0~(\ref{#1})}% + +\expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\@@magyar@refstruc + \babel@save\@@magyar@strucname + \let\@@magyar@refstruc \@@magyar@refstruc@hu + \let\@@magyar@refstrucparen \@@magyar@refstrucparen@hu + \let\@@magyar@strucname\@@magyar@strucname@hu +} + +\ifnum\magyar@opt@@refstruc \expandafter\ifx\csname refstruc\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \DeclareRobustCommand\refstruc{\@@magyar@refstruc}% + \DeclareRobustCommand\refstrucparen{\@@magyar@refstrucparen}% +\fi +\@gobble +{^} + +% --- Printing dates; emitdate= + +\ifnum\magyar@opt@@emitdate=0 \@@magyar@skiplong\fi +%** @param #1 1..12 (month number) +\def\@@magyar@month@a#1{\two@digits{#1}}% +\def\@@magyar@month@b#1{\ifcase#1\or janu\'ar\or febru\'ar\or m\'arcius\or + \'aprilis\or m\'ajus\or j\'unius\or j\'ulius\or augusztus\or szeptember\or + okt\'ober\or november\or december\fi}% +\def\@@magyar@month@c#1{\ifcase#1\or jan\or feb\or m\'arc\or + \'apr\or m\'aj\or j\'un\or j\'ul\or aug\or szept\or + okt\or nov\or dec\fi.\hbox{}}% +\def\@@magyar@month@d#1{\@Roman{#1}}% + +\def\@@magyar@four@digits#1{% + \ifnum#1<10 000\else\ifnum#1<100 00\else\ifnum#1<1000 0\fi\fi\fi\number#1% +} + +\def\@@magyar@date@a#1#2#3{#1-\@@magyar@month@a{#2}-\two@digits{#3}} +\def\@@magyar@date@b#1#2#3{#1.~\@@magyar@month@b{#2} \number#3\@@magyar@told@optdot\hbox{}}% Dat: \hbox is to force \frenchspacing +\def\@@magyar@date@c#1#2#3{#1.~\@@magyar@month@c{#2} \number#3\@@magyar@told@optdot\hbox{}} +\def\@@magyar@date@d#1#2#3{#1.~\@@magyar@month@d{#2}.\ \number#3\@@magyar@told@optdot\hbox{}} +\def\@@magyar@date@e#1#2#3{#1.~\@@magyar@month@a{#2}.\ \two@digits{#3}\@@magyar@told@optdot\hbox{}} +\def\@@magyar@date@f#1#2#3{#1.~\@@magyar@month@b{#2}} +\def\@@magyar@date@g#1#2#3{#1.~\@@magyar@month@b{#2} \number#3}% Dat: \told{\@@magyar@date@g{1848}{3}{15}}+e{} +\def\@@magyar@date@h#1#2#3{#1~\@@magyar@month@b{#2}}% Imp: suffixes to months +\def\@@magyar@date@i#1#2#3{#1/\@@magyar@month@a{#2}/\two@digits{#3}}% not Hungarian + +\def\@@magyar@parsedate@a#1-#2-#3!#4\hfuzz{% ISO date: YYYY-MM-DD + \ifx\hfuzz#4\hfuzz\else \ifnum1<1\string#1\relax \ifnum1<1\string#2\relax \ifnum1<1\string#3\relax + \def\reserved@a{\@@magyar@fixdate{#1}{#2}{#3}}% + \fi\fi\fi\fi +} +\def\@@magyar@parsedate@b#1/#2/#3!#4\hfuzz{% LaTeX date: YYYY/MM/DD + \ifx\hfuzz#4\hfuzz\else \ifnum1<1\string#1\relax \ifnum1<1\string#2\relax \ifnum1<1\string#3\relax + \def\reserved@a{\@@magyar@fixdate{#1}{#2}{#3}}% + \fi\fi\fi\fi +} +\def\@@magyar@parsedate@c#1.#2.#3!#4\hfuzz{% English date: YYYY.DD.MM + \ifx\hfuzz#4\hfuzz\else \ifnum1<1\string#1\relax \ifnum1<1\string#2\relax \ifnum1<1\string#3\relax + \def\reserved@a{\@@magyar@fixdate{#1}{#3}{#2}}% + \fi\fi\fi\fi +} +\def\@@magyar@mon@jan{1}% +\def\@@magyar@mon@feb{2}% +\def\@@magyar@mon@mar{3}% +\def\@@magyar@mon@apr{4}% +\def\@@magyar@mon@maj{5}% +\def\@@magyar@mon@may{5}% english.ldf +\def\@@magyar@mon@jun{6}% +\def\@@magyar@mon@jul{7}% +\def\@@magyar@mon@aug{8}% +\def\@@magyar@mon@sze{9}% +\def\@@magyar@mon@sep{9}% english.ldf +\def\@@magyar@mon@okt{10}% +\def\@@magyar@mon@oct{10}% english.ldf +\def\@@magyar@mon@nov{11}% +\def\@@magyar@mon@dec{12}% +\def\@@magyar@parsedate@d#1. #2#3#4#5 #6!#7\hfuzz{% {2003. oktober 25} with \catcodes 12 and 10 + \ifx\hfuzz#7\hfuzz\else + % Dat: now: {#1} is {2003}, {#2#3#4#5} is {oktober}, {#6} is {25} + \ifnum1<1\string#1\relax \ifnum1<1\string#6\relax + \lowercase{% + \expandafter\ifx\csname @@magyar@mon@#2#3#4\endcsname\relax\else + %%\errmessage{(#1)(#2#3#4)(#6)}% + \edef\reserved@a{\noexpand\@@magyar@fixdate{\number#1}{\csname @@magyar@mon@#2#3#4\endcsname}{\number#6}}\fi + }% + \fi\fi\fi +} +\def\@@magyar@parsedate@e#1#2#3#4 #5, #6!#7\hfuzz{% {October 25, 2003} with \catcodes 12 and 10 + \ifx\hfuzz#7\hfuzz\else + \ifnum1<1\string#5\relax \ifnum1<1\string#6\relax + \lowercase{% + \expandafter\ifx\csname @@magyar@mon@#1#2#3\endcsname\relax\else + \edef\reserved@a{\noexpand\@@magyar@fixdate{\number#6}{\csname @@magyar@mon@#1#2#3\endcsname}{\number#5}}\fi + }% + \fi\fi\fi +} + +\def\@@magyar@parsedate@f#1/#2/#3:#4!#5\hfuzz{% LaTeX default \today: YYYY/MM/DD:XX:YY + \ifx\hfuzz#5\hfuzz\else \ifnum1<1\string#1\relax \ifnum1<1\string#2\relax \ifnum1<1\string#3\relax + \def\reserved@a{\@@magyar@fixdate{#1}{#2}{#3}}% + \fi\fi\fi\fi +} + +\def\@@magyar@stripdot@lowa#1.\relax{#1\relax}% +\def\@@magyar@stripdot@lowb#1\relax#2\relax{#1}% +%** by pts@fazekas.hu at Sun Jul 27 15:17:57 CEST 2003 +%** Expands to #1, with a single optional dot (token `.') at the end removed. +%** @param #1 a token list not containing `\relax' (sic) +\def\@@magyar@stripdot#1{\expandafter\@@magyar@stripdot@lowb\@@magyar@stripdot@lowa#1\relax.\relax}% + +%** Definies \reserved@a to {{YYYY}{MM}{DD}} (possibly fewer digits). Parsing +%** is not perfect, but can distinguish between the known formats +%** @param #1 a date in any format, will be expanded +\def\@@magyar@parsedate#1{% + %\let\@@protect\protect \let\protect\@gobble \afterassignment\restore@protect + \begingroup + \def\today{\the\year-\the\month-\the\day}% ISO format + \let\protect\string + \let\'\@firstofone% Dat: (j\'unius, janu\'ar, okt\'ober) date won't contain other accents -- I hope + \let~\space + % ^^^ change `2003.~okt\'ober 25.' to `2003. oktober 25.' + \edef\reserved@b{\def\noexpand\reserved@b{#1}}% + \expandafter\endgroup\reserved@b + \edef\reserved@b{\expandafter\@@magyar@stripdot\expandafter{\reserved@b}}% + %%\show\reserved@b\tracingmacros1 + % vvv Wizardry: deep, parsing dates + \let\reserved@a\@empty \expandafter\@@magyar@parsedate@a\reserved@b!--!\hfuzz + \ifx\reserved@a\@empty \expandafter\@@magyar@parsedate@f\reserved@b!//:!\hfuzz \fi + \ifx\reserved@a\@empty \expandafter\@@magyar@parsedate@b\reserved@b!//!\hfuzz \fi + \ifx\reserved@a\@empty \expandafter\@@magyar@parsedate@c\reserved@b!..!\hfuzz \fi + \ifx\reserved@a\@empty \expandafter\@@magyar@parsedate@d\reserved@b!. xyz !\hfuzz \fi + \ifx\reserved@a\@empty \expandafter\@@magyar@parsedate@e\reserved@b!xyz , !\hfuzz \fi + %%\show\reserved@a + \ifx\reserved@a\@empty + \@@magyar@error{Unrecognised date: \reserved@b}% + %\@@magyar@fixdate{0}{1}{1}}% + \def\reserved@a{{0}{1}{1} {\noexpand\reset@font\noexpand\bfseries \string?date\string?}}% + \else + \reserved@a% calls \@@magyar@fixdate, which sets \reserved@a + \fi + %%\show\reserved@a +}% +%** Definies \reserved@a to {{YYYY}{MM}{DD}} (possibly fewer digits) +%** @param #1 year (50..99 += 1900, 0..49 += 2000) +%** @param #2 month (1..12) +%** @param #3 day of month (1..31), validity of 29..31 not verified +\def\@@magyar@fixdate#1#2#3{% + \edef\reserved@a{\number#1}% + \ifnum\reserved@a<0 \def\reserved@a{0}\@@magyar@error{Year too small: #1}\else + \ifnum\reserved@a<10 \edef\reserved@a{200\reserved@a}\else + \ifnum\reserved@a<50 \edef\reserved@a{20\reserved@a}\else + \ifnum\reserved@a<100 \edef\reserved@a{19\reserved@a}\else + \ifnum\reserved@a<10000 \else + \def\reserved@a{0}\@@magyar@error{Year too large: #1}% + \fi\fi\fi\fi\fi + \ifnum#2<1 \@@magyar@error{Month too small: #2}\fi% Imp: reset to 0? + \ifnum#2>12 \@@magyar@error{Month too large: #2}\fi + \ifnum#3<1 \@@magyar@error{Day of month too small: #3}\fi% Imp: reset to 0? + \ifnum#3>31 \@@magyar@error{Day of month too large: #3}\fi + \edef\reserved@a{{\reserved@a}{\number#2}{\number#3}}% +} + +%** Usage: \magyar@emitdate{FMT}{DATE} or \magyar@emitdate[SUFFIX]{FMT}{DATE} +%** @example [\emitdate{b}{October 25, 2003}] +%** @example %[\emitdate{b}{x-y-z}]% ! Package magyar.ldf Error: Unrecognised date: x-y-z. +%** @example A mai dtum: [\emitdate{b}{\today}]. +%** @example [\emitdate[e]{g}{1848.15.3}] a nap, mikor elhangzott a Nemzeti dal. +%** @example [\emitdate{b}{1956-10-23}] +%** @example \told{\@@magyar@date@g{1848}{3}{115}}+a{} +%** @param SUFFIX any suffix for \told, e.g `e' or `adik+an' +%** @param DATE date in any format, will be expanded +%** @param FMT a single letter, specifies the format of the emitted date +%** a: 1848-03-15 (ISO dtumformtum, 2002-tl(?) a magyar helyesrs rsze) +%** b: 1848.\ mrcius 15. +%** c: 1848.\ mrc.\ 15. +%** d: 1848.\ III.\ 15. +%** e: 1848.\ 03.\ 15. +%** f: 1848. mrcius kzepe +%** g: 1848. mrcius 15[-e reggele] +%** h: 1848 mrcius [hnapjnak kzepe, mrciusnak kzepe, mrciusban stb.] birtokos rag +%** english.ldf: `October 25, 2003' or [UK]: `25th October 2003' +\def\@@magyar@emitdate{% + \@ifnextchar[\@@magyar@emitdate@opt{\@@magyar@emitdate@opt[]}%] +} +\def\@@magyar@emitdate@opt[#1]#2#3{% + \begingroup + \@@magyar@parsedate{#3}% + % Imp: error message if \@@magyar@told is undefined + %\show\reserved@a + \edef\reserved@a{% + \ifx\vfuzz#1\vfuzz \expandafter\noexpand\csname @@magyar@date@#2\endcsname\reserved@a + \else \noexpand\@@magyar@told{\expandafter\noexpand\csname @@magyar@date@#2\endcsname\reserved@a}+#1{}\fi + }% + %\show\reserved@a + %%\show~ + %\show\reserved@a% \told {\@@magyar@date@g {1848}{3}{15}}+e{} + \reserved@a + \endgroup +} + +\ifnum\magyar@opt@@emitdate \expandafter\ifx\csname emitdate\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \let\emitdate\@@magyar@emitdate +\fi +\@gobble +{^}% + +% --- titleskip= + +\ifx\magyar@opt@@titleskip\magyar@@unchanged + \def\magyar@opt@@titleskip{\enspace}% for the appendix with appendixdot=no +\@@magyar@skiplong\fi + \expandafter\addto\csname extras\CurrentOption\endcsname{\magyar@@seccntfix}% + \let\magyar@@seccntfix\@empty + \let\magyar@@default@seccntformat\@seccntformat + \AtBeginDocument{% + % vvv \ifx added for compatiblity with other packages redefining \@seccntformat _after_ magyar.ldf has been loaded + \ifx\@seccntformat\magyar@@default@seccntformat + % \@seccntformat affects dot after the section number in the main text. + % We don't change the TOC file, because we've changed \numberline. Also + % \ps@headings in book.cls already contains a dot. + \def\magyar@@seccntfix{% + \ifx\@seccntformat\@gobble\else + \babel@save\@seccntformat + \def\@seccntformat##1{\csname the##1\endcsname.\magyar@opt@@titleskip}% + \fi + } + \fi + } + \@gobble +{^}% + +% --- footnote= + +\if0\magyar@opt@@footnote \@@magyar@skiplong\fi + %** Overrides latex.ltx. Expand old contents of \cl@#2 only once. + \def\@addtoreset#1#2{% + \begingroup + \edef\reserved@a{\noexpand\@elt{#1}}% + \expandafter\magyar@fo@consra\csname cl@#2\endcsname\gdef + \endgroup + } + %** Similar to \@cons in latex.ltx + %** Appends first-level expansion of \reserved@a + %** @param #1 a \cs + %** @param #2 \def or \gdef + \def\magyar@fo@consra{\expandafter\magyar@fo@cons\expandafter{\reserved@a}}% + %** @param #1 tokens to append + %** @param #2 a \cs + %** @param #3 \def or \gdef + \def\magyar@fo@cons#1#2#3{\expandafter#3\expandafter#2\expandafter{#2#1}}% + + % vvv Dat: \@definecounter can be called twice, \newcounter cannot + \@definecounter{footnote@add}% \newcounter{footnote@add} + %** Number of times footnote numbering has been reset + \@definecounter{footnote@ch} + + \def\magyar@fo@pickzero#1#2#3\hfuzz#4{% + \ifx\relax#1\else \def#4{{#1}{#2}}\fi% pick {#1}{#2} + } + %** Dat: footnotes inside \begin{minipage} are not affected -- intentionally. + %** Will be called by \stepcounter{...} after `\advance\c@footnote1' + \def\magyar@fo@resetzero@afterpage{% + {% { is better \begingroup, because { works in a tabular + \@tempcnta\c@footnote@add + \advance\@tempcnta\c@footnote + \let\reserved@a\@empty% default + % Dat: we ignore \@roman etc. in \thefootnote + \expandafter\expandafter\expandafter\magyar@fo@pickzero\csname r@footnote&\the\c@footnote@ch&\the\@tempcnta\endcsname00\hfuzz\reserved@a% this footnote + \ifx\reserved@a\@empty \G@refundefinedtrue\fi + % + \def\magyar@fo@@prevfn{-}% default + \advance\@tempcnta\m@ne + \expandafter\expandafter\expandafter\magyar@fo@pickzero\csname r@footnote&\the\c@footnote@ch&\the\@tempcnta\endcsname00\hfuzz\magyar@fo@@prevfn% previous footnote + \advance\@tempcnta\@ne + % + \ifx\reserved@a\magyar@fo@@prevfn\else + % Restart footnote numbering (from 1) if \label is missing for previous + % footnote, or \label reports that prev and this footnotes aren't on the + % same page. + \global\advance\c@footnote@add\c@footnote + \global\advance\c@footnote@add\m@ne + \global\c@footnote\@ne + \fi + \def\@currentlabel{\noexpand\number\c@page}% + % ^^^ Dat: \noexpand is here to make \number\c@page expanded during \shipout + \ifx\@listdepth\@mplistdepth% inside \begin{minipage} + % vvv Dat: expand \thepage both early (minipage) and late (real page) + \edef\@currentlabel{\@currentlabel-\thepage}% + \fi + \edef\reserved@a{\noexpand\label{footnote&\the\c@footnote@ch&\the\@tempcnta}}% + % ^^^ Dat: the \label command above produces correct warning (LaTeX + % Warning: Label(s) may have changed. Rerun to get cross-references + % right.), and it also produces `LaTeX Warning: There were undefined + % references.' in case a footnote is removed or changed, and also for + % the very first run. Fine. + \reserved@a + }%\endgroup + } + + \let\magyar@fo@resetzero\relax + + %\magyar@fo@cons{XY}\cl@footnote\gdef + \magyar@fo@cons{\magyar@fo@resetzero}\cl@footnote\gdef + + %\def\magyar@fo@resetadd{% + % \global\advance\c@footnote\c@footnote@add + % \global\c@footnote@add\z@ + %} + \def\magyar@fo@aftergrouprelax#1{% + \ifx#1\relax\else + \aftergroup#1% + \expandafter\magyar@fo@aftergrouprelax + \fi + } + + \def\magyar@fo@mtostar#1{% + \if#1m% + *\expandafter\magyar@fo@mtostar + \fi + } + %** Producing `m's based on the idea of David Kastrup. + %** The default `*' character is in raised position, and we also move it to + %** \@textsuperscript, so it will be double raised. But never mind. + \def\magyar@fo@thefootnote@stars{\expandafter\magyar@fo@mtostar\romannumeral\number\c@footnote000A}% + \def\magyar@fo@thefootnote@starsspmax{\ifcase\c@footnote\or*\or**\or***\or\dag\or\dag\dag\or\dag\dag\dag\else*\the\c@footnote\fi}% + \def\magyar@fo@thefootnote@arabic{\@arabic\c@footnote} + \def\magyar@fo@thempfootnote@stars{\expandafter\magyar@fo@mtostar\romannumeral\number\c@mpfootnote000 A}% + \def\magyar@fo@thempfootnote@starsspmax{\ifcase\c@mpfootnote\or*\or**\or***\or\dag\or\dag\dag\or\dag\dag\dag\else*\the\c@mpfootnote\fi}% + \def\magyar@fo@thempfootnote@arabic{\@arabic\c@mpfootnote} + + % !! indent=article must work within \maketitle for article.cls etc. + + %** Copied from article.cls, added \,. + %** Has #1, but partially applied here + \def\magyar@fo@indent@articlesp{% + \parindent1em % SUXX: impossible to acquire default value + % Dat: don't use \@makefnmark here, because it puts the footnote mark + % only to the main text + \noindent\hb@xt@1.8em{\hss\@textsuperscript{\normalfont\@thefnmark\,}}% + } + %** Same as \@makefntext in article.cls + %** Has #1, but partially applied here + \def\magyar@fo@indent@articlenosp{% + \parindent1em % SUXX: impossible to acquire default value + % Dat: don't use \@makefnmark here, because it puts the footnote mark + % only to the main text + \noindent\hb@xt@1.8em{\hss\@textsuperscript{\normalfont\@thefnmark}}% + } + \def\magyar@@fo@indent@dimensetup{% + \parindent1em % SUXX: impossible to acquire default value + %\advance\leftskip1.8em % SUXX: impossible to acquire default value + \leftskip\leftmargini % SUXX: impossible to acquire default value + } + %** Has #1, but partially applied here + \def\magyar@fo@indent@hulist{% + % Dat: superscript is emitted by \@makefnmark + % Dat: \parindent doesn't apply for the 1st par of the footnote + \magyar@@fo@indent@dimensetup + \ifvmode\noindent\hb@xt@\z@\else\hbox\fi + % ^^^ \usepackage[para]{footmisc} emits footnotes in horizontal mode + {\hss\@textsuperscript{\normalfont\@thefnmark\,}}% + } + + %** Limit the size of the footnote mark (in main text) to \normalsize. + %** Overrides latex.ltx + \def\magyar@fo@makefnmark{% + \hbox{% has \begingroup + \edef\reserved@a{\f@size}% + {\normalsize\edef\reserved@b{\def\noexpand\reserved@b{\f@size}}\expandafter}\reserved@b + \ifdim\reserved@a pt>\reserved@b pt + %\normalsize\@textsuperscript{\normalfont\footnotesize\@thefnmark}% Dat: would place index too low + \@textsuperscript{\normalfont\scriptsize\@thefnmark}% + \else\@textsuperscript{\normalfont\@thefnmark}\fi + }% + } + \let\magyar@fo@@cont@number\@empty + \def\magyar@fo@savecont{\global\edef\magyar@fo@@cont@number{\global\c@footnote\the\c@footnote\space}} + + %** \footnoterule, as defined in latex.ltx + \def\magyar@fo@defaultrule{\kern-3\p@ + \hrule \@width 2in \kern 2.6\p@} % the \hrule is .4pt high + \def\magyar@fo@fourthrule{\kern-3\p@%\hrule\hrule\hrule + \hrule \@width .25\textwidth \kern 2.6\p@} % the \hrule is .4pt high + \def\magyar@fo@onelinerule{% + \unskip% undo \vskip\skip\footins + {\normalsize% Dat: \normalfont is superfluous + \vskip1\baselineskip plus.1\baselineskip minus .1\baselineskip}% + % ^^^ Dat: plus,minus is necessary to avoid `Overfull \vbox (8.86676pt too high)' + } + \def\magyar@fo@chooserule{\relax + \ifx \@listdepth\@mplistdepth \mpfootnoterule \else + \ifnum\split@prev=\z@ \pagefootnoterule \else \splitfootnoterule + \fi + %%\typeout{\string\split@prev=\split@prev}% + \xdef\split@prev{\the\insertpenalties}% + \fi + } + + % `Szerkesztk s szerzk kziknyve, p. 116' says this about Hungarian + % footnotes. Implementation notes are marked with [...]. See better docs + % in magyarldf-doc.tex + % + % (1) Use numbering and/or stars (in upper index) for footnote marks. + % Numbering is recommended. + % [1] Use \footnotestyle{mark=...} + % (2) You can put footnotes by the editor with a star, and footnotes by the + % author with numbers. + % [2] Use \footnotestyle{huplain} in the preamble, and emit each editorial + % footnote with {\footnotestyle{editor}\footnote{Her note.}} + % (3) Don't put \footnoterule if the footnote starts on current page. + % [3] Use \footnotestyle{rule=none}. Please make sure that the group lasts + % till \shipout. + % (4) Put a \footnoterule (1/3\textwidth or 1/4\textwidth) if footnote is + % continued from previous page. + % [4] Not supported. Imp: how to? + % (5) Multiple short footnotes may be put into a single line. + % [5] \usepackage[para]{footmisc} or \usepackage{fnpara} + % (6) Footnotes for \begin{figure} and \begin{table} must be put just under + % them, not at EOP. + % [6] The author should enclose the matrial in a \begin{minipage} + % (7) The size of the \footnotemark should not be scaled up. + % [7] Use \footnotestyle{marksize=max-normal} + % (8) It is possible to use either \parindent or \item when starting a + % footnote. + % [8] Use \footnotestyle{indent=hulist} + % (9) The footnotemark must be followed by a thin space (only at BOP). + % [9] OK, see \@makefntext + % (10) Don't emit too much stars. Recommended: * ** *** + ++ +++ + % [10] OK, see \footnoterule{mark=stars-max}. `\dag' is emitted instead + % of `+', and `*7' is emitted for the 7th footnote on the page. + % + + \@namedef{fos@reset=none}{\let\magyar@fo@resetzero\relax}% + %** Similar to \@addtoreset{footnote}{section}, but isn't \global. + \@namedef{fos@reset=section}{% + \let\magyar@fo@resetzero\relax + \magyar@fo@cons{\@elt{footnote}}\cl@section\def + \magyar@fo@cons{\@elt{footnote}}\cl@chapter\def + }% + \@namedef{fos@reset=chapter}{% + \let\magyar@fo@resetzero\relax + \magyar@fo@cons{\@elt{footnote}}\cl@chapter\def + }% + %** Next footnote-mark will be `*'. The slots of `*'s of \fos@huplain + %** were skipped when changing back to \fos@plain. Restarts numbering from + %** 1 (`*'). Usually called as \footnotestyle{resume,reset=page-cont} + \@namedef{fos@reset=page}{% + \stepcounter{footnote@ch}% + \global\c@footnote@add\z@% + \global\c@footnote\z@% + \let\magyar@fo@resetzero\magyar@fo@resetzero@afterpage + %\aftergroup\magyar@fo@resetadd% switched off deliberately + } + %** editorial footnote on the same page + \@namedef{fos@reset=page-cont}{% + \aftergroup\magyar@fo@savecont + \fos@resume% only \aftergroup + \magyar@fo@@cont@number + \let\magyar@fo@resetzero\magyar@fo@resetzero@afterpage + } + \@namedef{fos@reset=page-resume}{% + \fos@resume \csname fos@reset=page\endcsname + } + %** Resume to the previous footnote number at the end of the group. (Default: don't resume) + %** \footnotestyle{resume,reset=page} is the correct order + \def\fos@resume{% + \aftergroup\global + \aftergroup\c@footnote + \expandafter\magyar@fo@aftergrouprelax\the\c@footnote\relax + \aftergroup\space + %\magyar@fo@resetadd% Dat: not needed because \magyar@fo@resetzero@afterpage won't find prev. ref + } + % + \@namedef{fos@indent=article-sp}{\let\@makefntext\magyar@fo@indent@articlesp}% + \@namedef{fos@indent=article-nosp}{\let\@makefntext\magyar@fo@indent@articlenosp}% + \@namedef{fos@indent=hulist}{\let\@makefntext\magyar@fo@indent@hulist}% + %** This is not a 100% solution, because there might be multiple iterations + %** of \footnoterule with different \split@prev values. + \@namedef{fos@rule=choose}{% ripped from footmisc.sty + \ifx\footnoterule\magyar@fo@chooserule + \let\footnoterule\magyar@fo@defaultrule + \fi + \expandafter\ifx\csname pagefootnoterule\endcsname\relax \let \pagefootnoterule\footnoterule\fi + \expandafter\ifx\csname mpfootnoterule\endcsname\relax \let \mpfootnoterule\footnoterule\fi + \expandafter\ifx\csname splitfootnoterule\endcsname\relax \let\splitfootnoterule\magyar@fo@fourthrule\fi + \expandafter\ifx\csname split@prev\endcsname\relax \gdef\split@prev{0}\fi + % ^^^ Dat: \split@prev is named the same in footmisc.sty + \let\footnoterule\magyar@fo@chooserule + } + \@namedef{fos@rule=none}{\let\footnoterule\@empty}% + \@namedef{fos@rule=fourth}{\let\footnoterule\magyar@fo@fourthrule}% + \@namedef{fos@rule=one-line}{\let\footnoterule\magyar@fo@onelinerule}% + \@namedef{fos@marksize=max-normal}{\let\@makefnmark\magyar@fo@makefnmark}% + \@namedef{fos@mark=arabic}{\let\thefootnote\magyar@fo@thefootnote@arabic}% + \@namedef{fos@mark=stars}{\let\thefootnote\magyar@fo@thefootnote@stars}% + \@namedef{fos@mark=stars-max}{\let\thefootnote\magyar@fo@thefootnote@starsspmax}% + \@namedef{fos@mpmark=arabic}{\let\thempfootnote\magyar@fo@thempfootnote@arabic}% + \@namedef{fos@mpmark=stars}{\let\thempfootnote\magyar@fo@thempfootnote@stars}% + \@namedef{fos@mpmark=stars-max}{\let\thempfootnote\magyar@fo@thempfootnote@starsspmax}% + %\def\fos@globalmark{\expandafter\global\expandafter\let\csname the\@mpfn\endcsname\endcsname\thefootnote} + %\def\fos@globalmpmark{\global\let\thempfootnote\thefootnote} + + \def\fos@plain{\csname fos@reset=none\endcsname\csname fos@mark=arabic\endcsname} + \def\fos@huplain {\csname fos@marksize=max-normal\endcsname \csname fos@reset=none\endcsname\csname fos@mark=arabic\endcsname\csname fos@rule=none\endcsname\csname fos@indent=hulist\endcsname} + \def\fos@starplain{\fos@huplain\csname fos@reset=page\endcsname\csname fos@mark=stars-max\endcsname}% + %\def\fos@editor{\fos@resume\fos@starplain}% + \def\fos@editor{\fos@huplain\csname fos@reset=page-cont\endcsname\csname fos@mark=stars-max\endcsname}% + + \def\footnotestyle#1{% + \@for\reserved@a:=#1\do{% + \@ifundefined{fos@\reserved@a}{\@latex@error{Undefined footnote style: \reserved@a}\@ehc}% + {\csname fos@\reserved@a\endcsname}% + }% + } + + \def\editorfootnote#1{\begingroup\footnotestyle{editor}% + \footnote{#1}\endgroup}% + \def\headingfootnote{% + \ifx\protect\@typeset@protect\expandafter\footnote + \else\expandafter\@gobble\fi + % ^^^ Dat: this test is better, because it makes magyar.ldf compatible + % with nath.sty that says \def\protect{\noexpand} in its redefinition + % of \addtocontents + %\ifx\protect\@unexpandable@protect\expandafter\@gobble + %\else\expandafter\footnote\fi + } + + %** @param #1 an end-csname, example: \endfigure + \def\magyar@fo@mp@setup#1{% + \let\@footnotetext\@mpfootnotetext + \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@ + % ^^^ This line is optional, but strongly recommended. Restart numbering + % for each float, and number with \thempfootnote. + % vvv Very tricky use of `#' in expansion. + % Dat: \magyar@fo@mp@show is idempotent + % vvv Prepend \magyar@fo@mp@show to the definition of \@makecaption + \expandafter\def\expandafter\@makecaption\expandafter##\expandafter1% + \expandafter##\expandafter2\expandafter{\expandafter\magyar@fo@mp@show% + \@makecaption{##1}{##2}% + }% + %%\show\@currenvir + % vvv Dat: this prepending has only local effect. + \expandafter\def\expandafter#1\expandafter{% + \expandafter\magyar@fo@mp@show#1}% + %\expandafter\magyar@fo@mp@prepend\csname\@currenvir\endcsname + \setbox\@mpfootins\box\voidb@x + } + \def\magyar@fo@mp@show{% ripped from latex.ltx (\endminipage) + \ifvoid\@mpfootins\else + \par\unskip \vskip\skip\@mpfootins + \normalcolor \footnoterule + \expandafter\ifx\csname mpmakefootnoteparagraph\endcsname\relax + \unvbox\@mpfootins + \else% fnpara.sty + \mpmakefootnoteparagraph + \fi + \fi + } + + %** Only works if \cs of #1 doesn't have macro arguments. It works for + %** \figure and \table, because their optional argument `[b]' etc. is not + %** a macro argument. + %** @example \makeFootnotable{figure} + %** @example \makeFootnotable{} -- current instance of current environment + \def\makeFootnotable#1{% + \if\relax#1\relax + \expandafter\magyar@fo@mp@setup\csname end\@currenvir\endcsname + \else + \expandafter\expandafter\expandafter\magyar@fo@makef@low + \expandafter\expandafter\csname #1\endcsname + \csname end#1\endcsname + \fi + } + %** @example \magyar@fo@makef@low\table\endtable + \def\magyar@fo@makef@low#1#2{\expandafter\def\expandafter#1\expandafter{% + \expandafter\magyar@fo@mp@setup\expandafter#2#1}}% + + \if2\magyar@opt@@footnote \fos@huplain\fi + \if3\magyar@opt@@footnote \fos@starplain\fi + \@gobble +{^} + +% --- mathbrk= + +\if0\magyar@opt@@mathbrk \@@magyar@skiplong\fi + %** Similar to \@@magyar@fixmathcmd@low, but inserts symbol immediately. + %** @param #1 `\mathchar', all catcodes + %** @param #2 hex code + %** @param #3 ignored + %** @param #4 a \cs + \def\@@magyar@breakmathcmd@low#1"#2"#3\hfuzz#4{% + \def\reserved@a{#1}% + \edef\reserved@b{\string\mathchar}% + \ifx\reserved@a\reserved@b + \mathchar"#2 + \ifnum"#2<"8000 % redundant sanity check, trueness implied by #1==\mathchar + \nobreak\discretionary{}{\hbox{\(\mathchar"#2 \)}}{}% + \fi + \fi + }% + %** Dat: robustness is tested and works with nath.sty + %** @param #1 a \cs or char of a MathBin or MathRel, e.g `\prec' or `+' + \DeclareRobustCommand\MathBrkAll[1]{% + \ifcat\noexpand#1\relax + \expandafter\@@magyar@breakmathcmd@low\meaning#1""\hfuzz#1% + \else + \ifnum\mathcode`#1="8000 + \expandafter\expandafter\expandafter#1% keep original meaning + \else + \mathchar\the\mathcode`#1\relax% disable \active meaning + \ifnum\mathcode`#1<"8000 % redundant sanity check + \nobreak\discretionary{}{\hbox{\(\mathchar\the\mathcode`#1\relax\)}}{}% + \fi + \fi + \fi + } + \let\MathBrk\relax + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\MathBrk + \let\MathBrk\MathBrkAll + } + \@gobble +{^} + +\if2\magyar@opt@@mathbrk\else \@@magyar@skiplong\fi % mathbrk=fix + \def\@@magyar@resetmathchars{% + \mathcode`+"202B \catcode`+12 + \mathcode`-"2200 \catcode`-12 + \mathcode`*"2203 \catcode`*12 + \mathcode`/"013D \catcode`/12 + \mathcode`>"313E \catcode`>12 + \mathcode`<"313C \catcode`<12 + \mathcode`="303D \catcode`=12 + % vvv Dat: leave these chars intact, for compatibility (with nath.sty and others) + %\mathcode`:"303A \catcode`:12 + %\mathcode`;"603B \catcode`;12 + %\mathcode`,"613B \catcode`,12 + %\mathcode`!"5021 \catcode`!12 + %\mathcode`?"503F \catcode`?12 + %\mathcode`|"026A \catcode`|12 + %\mathcode`."013A \catcode`.12 + } + %** Dat: don't do `/', because slash is unbreakable + \def\@@magyar@domathbins{% + \do-\@@magyar@fix@newmcodes@dash + \do+\do*\do>\do<\do=}% + %** @param #1 a char token with \mathcode != "8000, like + + \def\@@magyar@fixmathbinchar#1{% + \ifnum\mathcode`#1="8000 \else + % Dat: \(...\) is safer than `$...$', because \( has a fixed \catcode + % that works with and w/o nath.sty + \begingroup\lccode\string`~\string`#1\lowercase{\endgroup\edef~}{% + \mathchar\the\mathcode`#1\relax% Dat: would need \space\space + \noexpand\ifx\noexpand\MathBrk\noexpand\MathBrkAll% Hungarian language is active + \nobreak\discretionary{}{\hbox{\noexpand\(\mathchar\the\mathcode`#1 \noexpand\)}}{}% + \noexpand\fi}% + \mathcode`#1"8000 + \fi + \catcode`#112 + } + %** \newmcodes@ defined in amsopn.sty doesn't work (triggered by + %** \DeclareMathOperator{\tg}{tg} $\tg$) because it wants to assign + %** \mathchardef\std@minus\mathcode`\-, which is "8000, which is a bad + %** matchar. We fix that by prepending \mathcode`-45 to \newmcodes@ . + %** This is OK, because \newmcodes@ is protected by a block set up by + %** \qopname. + \def\@@magyar@newmcodes@fixed{\mathcode`-"45 \magyar@@newmcodes}% + \def\@@magyar@fix@newmcodes@dash{% + \ifx\newmcodes@\@undefined\else + \ifx\newmcodes@\@@magyar@newmcodes@fixed\else % Protect against double redefinition such as in \begin{align*}\tg\end{align*} + \let\magyar@@newmcodes\newmcodes@ + \let\newmcodes@\@@magyar@newmcodes@fixed + \fi + \fi + }% + + %** @param #1 `\mathchar', all catcodes + %** @param #2 hex code + %** @param #3 ignored + %** @param #4 a \cs + \def\@@magyar@fixmathcmd@low#1"#2"#3\hfuzz#4{% + % Imp: check \cong and \notin with txfonts and pxfonts. Do they look OK? + \def\reserved@a{#1}% + \edef\reserved@b{\string\mathchar}% + \ifx\reserved@a\reserved@b + \ifnum"#2<"8000 % redundant sanity check, trueness implied by #1==\mathchar + % Make #4 robust. + \edef#4{\noexpand\protect\expandafter\noexpand\csname + \expandafter\@gobble\string#4 \endcsname}% + % vvv Imp: \def would be better than \edef? + \expandafter\edef\csname\expandafter\@gobble\string#4 \endcsname{% + % Dat: \mathchar already produces: `! Missing $ inserted.' + \mathchar"#2 + \noexpand\ifx\noexpand\MathBrk\noexpand\MathBrkAll% Hungarian language is active + \nobreak\discretionary{}{\hbox{\noexpand\(\mathchar"#2 \noexpand\)}}{}% + \noexpand\fi + }% + \fi + \fi + }% + %** Works even if #1 is undefined (but consumes hash memory) + %** @param #1 a \cs of a MathBin or MathRel, e.g \prec + \def\@@magyar@fixmathcmd#1{% + \expandafter\@@magyar@fixmathcmd@low\meaning#1""\hfuzz#1% + } + + \let\@@magyar@domathbins@prefix\@empty + \def\@@magyar@fixeverymathcmds@appendto#1{% + \expandafter\def\expandafter#1\expandafter{#1% append + \@@magyar@resetmathchars + \let\do\@@magyar@fixmathbinchar + \@@magyar@domathbins@prefix\@@magyar@domathbins% only in math mode start + }% + } + \def\@@magyar@fixeverymathcmds@setup{% + \expandafter\ifx\csname mathoptions@on\endcsname\relax% no nath.sty + \@@magyar@fixeverymathcmds@appendto\check@mathfonts + \else\@@magyar@fixeverymathcmds@appendto\mathoptions@on\fi + } + + % The definition of \@tabular contains a $, which calls + % \@@magyar@domathbins, which has some unintended side effects of changing + % \catcode values and the meaning of the active character : . This magic + % prevents the call to \@@magyar@domathbins . + % + % Test code: \author{a:b} \maketitle + % Test code: \def\foo{a:b} \begin{tabular}[t]{c}x\foo y\end{tabular} + \def\@@magyar@mathbins@tabularfix#1${% + #1\def\@@magyar@domathbins@prefix{% + \let\@@magyar@domathbins@prefix\@empty\@gobble}$}% + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter\@tabular + \expandafter\expandafter\expandafter{% + \expandafter\@@magyar@mathbins@tabularfix\@tabular} + + \def\@@magyar@fixmathcmds{% + \let\do\@@magyar@fixmathcmd + % vvv Binary relations listed in Table 3.4 in lshort.dvi + \do\leq\do\le\do\ll\do\prec\do\preceq\do\subset\do\subseteq\do\sqsubset + \do\sqsubseteq\do\in\do\vdash\do\mid\do\smile\do\geq\do\ge\do\gg\do\succ + \do\succeq\do\supset\do\supseteq\do\sqsupset\do\sqsupseteq\do\ni\do\owns + \do\dashv\do\parallel\do\frown\do\notin\do\equiv\do\doteq\do\sim\do\simeq + \do\approx\do\cong\do\Join\do\bowtie\do\propto\do\models\do\perp\do\asymp + \do\neq\do\ne + % vvv Binary operators listed in Table 3.5 in lshort.dvi + %\do\cdot% unbreakable + \do\pm\do\times\do\cup\do\sqcup\do\vee\do\lor\do\oplus\do\odot\do\otimes + \do\bigtriangleup\do\lhd\do\unlhd\do\mp\do\div\do\setminus\do\cap\do\sqcap + \do\wedge\do\land\do\ominus\do\oslash\do\bigcirc\do\bigtriangledown\do\rhd + \do\unrhd\do\triangleleft\do\triangleright\do\star\do\ast\do\circ\do\bullet + \do\diamond\do\uplus\do\amalg\do\dagger\do\ddagger\do\wr + \edef\cdot{\noexpand\protect\csname cdot \endcsname}% + \expandafter\def\csname cdot \endcsname{\nobreak\mathchar"2201\nobreak}% + \def\slash{\nobreak/\nobreak}% only in math-mode start, \nobreak + % ^^^ Dat: \slash is fragile in latex.ltx + } + \AtBeginDocument{\@@magyar@fixmathcmds\@@magyar@fixeverymathcmds@setup} + \@gobble +{^} + +% --- mathfactorial= + +\if0\magyar@opt@@mathfactorial \@@magyar@skiplong\fi + % Imp: weak define? It doesn't conflict with nath.sty -- yet. + \def\factorial{\mathchar"5021\mathopen{}\mathinner{}} + \@gobble +{^} + +\if2\magyar@opt@@mathfactorial\else \@@magyar@skiplong\fi + \expandafter\addto\csname \expandafter\ifx\csname mathoptions@on\endcsname + \relax check@mathfonts\else mathoptions@on\fi\endcsname{% detect nath.sty + \catcode`!12 \mathcode`!"8000 + \begingroup\lccode`~`!\lowercase{\endgroup\def~}{\factorial}% + } + \@gobble +{^} + +% --- mathhucomma= + +\if0\magyar@opt@@mathhucomma \@@magyar@skiplong\fi + %** Dat: works for all catcodes, even for `end group character 5' + %** Inspired by Donald Aresenau + %** @param #1 the + %** @param #2 character + %** @example The sample in your article would be typed + %** \[ F_{i}(x,y) = y^i + 1,3x \qquad x,y \in A,\ i = 1, 2, 3,\ldots \] + \edef\@@magyar@hucomma@lowa#1#2 #3#4 #5#6\hfuzz{% + \noexpand\ifnum9<1#5 \noexpand\if#1t\noexpand\if#3c% + \noexpand\mathord\noexpand\fi\noexpand\fi\noexpand\fi\mathchar + \ifnum\mathcode`,="8000 "613B \else\the\mathcode`, \space\fi% immed expand + % Dat: "613B is the punctuation, "013B is ordinary + }% + %%\show\@@magyar@hucomma@lowa + \def\@@magyar@hucomma@lowb{\expandafter\@@magyar@hucomma@lowa\meaning\reserved@a/ / /\hfuzz}% + %** Put a \mathord, if it is followed by a digit; otherwise put a normal, + \DeclareRobustCommand\HuComma{\futurelet\reserved@a\@@magyar@hucomma@lowb} + \@gobble +{^} + +\if2\magyar@opt@@mathhucomma\else \@@magyar@skiplong\fi + % !! into \extrasmagyar + \expandafter\addto\csname \expandafter\ifx\csname mathoptions@on\endcsname + \relax check@mathfonts\else mathoptions@on\fi\endcsname{% detect nath.sty + \catcode`,12 \mathcode`,"8000 + \begingroup\lccode`~`,\lowercase{\endgroup\def~}{\HuComma}% + } + \@gobble +{^} + +% --- mathmuskips= + +% +\if1\magyar@opt@@mathmuskips% =latex, as defined in latex.ltx + \thickmuskip 5mu plus 5mu + \medmuskip 4mu plus 2mu minus 4mu + \thinmuskip 3mu +\fi +\if2\magyar@opt@@mathmuskips% =hu + \thickmuskip 4mu plus 2mu minus 4mu + \medmuskip 2mu plus 1.5mu minus 2mu % \medmuskip<\thinmuskip OK + \thinmuskip 3mu +\fi + +% --- hynumberline= +% by pts@fazekas.hu at Tue Nov 21 00:34:37 CET 2006 +% +% hynumberline=hu adds a dot after the section number in the bookmarks/outline +% with \hypersetup{bookmarksnumbered=true} in hyperref.sty. + +\if0\magyar@opt@@hynumberline \@@magyar@skiplong\fi + %** Overrides original definition (\def\Hy@numberline#1{#1 }) in + %** pdfmark.def. + %** Also possible with: + %** \pdfstringdefDisableCommands{\renewcommand*{\numberline}[1]{#1. }} + \def\@@magyar@@hynumberline@old#1{#1 }% as defined in pdfmark.def + \def\@@magyar@@hynumberline@hu #1{#1. }% + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \ifx \Hy@numberline\@@magyar@@hynumberline@old + \let\Hy@numberline\@@magyar@@hynumberline@hu \fi}% +\@gobble +{^}% + +% --- mathreal= + +\if0\magyar@opt@@mathreal \@@magyar@skiplong\fi + %** @param #1 a number with a possible decimal digit, e.g `12' or `-12.3' + \def\@@magyar@mathreal@lowa#1{\ensuremath{\@@magyar@mathreal@lowb#1\@gobble.}}% + \def\@@magyar@mathreal@lowb#1.{% + #1% + \@secondoftwo\@gobble% Wizardry: \@secondoftwo may be \@gobbled by token before `.' + {\mathchar"013B \@@magyar@mathreal@lowb}% + } + \DeclareRobustCommand\@@magyar@mathreal{\ensuremath}% + \expandafter\expandafter\expandafter\addto + \expandafter\expandafter\csname extras\CurrentOption\endcsname\expandafter{% + \expandafter\babel@save\csname @@magyar@mathreal \endcsname + \expandafter\let\csname @@magyar@mathreal \endcsname \@@magyar@mathreal@lowa}% + \ifnum\magyar@opt@@mathreal \expandafter\ifx\csname mathreal\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \let\MathReal\@@magyar@mathreal + \fi +\@gobble +{^}% + +% --- \documentclass-specific modifications; classmod= + +% Callback which redefines \ps@headings and runs it again if needed, when +% magyar.ldf has an override for the standard \ps@headings, and +% \pagestyle{headings} is active either explictly (e.g. in article.cls) or +% by default (e.g. in book.cls). +\let\@@magyar@setup@psheadings\relax + +%** Localized definition which replaces \ps@headings, if appropriate. +\let\@@magyar@overridden@psheadings\@empty + +\ifx\magyar@opt@@classmod\relax\@@magyar@skiplong\fi + +%** Appends the first-level expansion of argless macro ##2 to ##1. +\def\magyar@letappendto#1#2{% + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter#1% + \expandafter\expandafter\expandafter{% + \expandafter#1#2}}% + +%** Defines #1 to the concatenation of \partmark ... \subparagraphmark, +%** \oddfoot, \evenfoot, \oddhead, \evenhead. +\def\magyar@mark@fingerprint@def#1{% + % We have ! here because some macros (such as \partmark) have #1, which + % gets expanded by \expandafter + \def#1{markfp: }% + \ifx\partmark\@undefined + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter{-partmark}}% + \else + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter{\partmark!:partmark}}% + \fi + \magyar@letappendto#1\reserved@b + % + \ifx\chaptermark\@undefined + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter{-chaptermark}}% + \else + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter{\chaptermark!:chaptermark}}% + \fi + \magyar@letappendto#1\reserved@b + % + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter{\sectionmark!:sectionmark}}% + \magyar@letappendto#1\reserved@b + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter{\subsectionmark!:subsectionmark}}% + \magyar@letappendto#1\reserved@b + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter{\paragraphmark!:paragraphmark}}% + \magyar@letappendto#1\reserved@b + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter{\subparagraphmark!}}% + \magyar@letappendto#1\reserved@b + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter{\@oddfoot!:oddfoot}}% + \magyar@letappendto#1\reserved@b + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter{\@evenfoot!:evenfoot}}% + \magyar@letappendto#1\reserved@b + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter{\@evenhead!:evenhead}}% + \magyar@letappendto#1\reserved@b + \expandafter\def\expandafter\reserved@b\expandafter{% + \expandafter{\@oddhead!:oddhead}}% + \magyar@letappendto#1\reserved@b + % Dat: don't use \@mkboth (\let\@mkboth\markboth) +}% + +%** Branches based on whether the \pagestyle has changed since loading the +%** class file. +%** @param #1 class file name, e.g. `book.cls'. Tested with book.cls and +%** report.cls. +%** @param #2 tokens to insert before fingerprinting the current page style. +%** @param implicit-#3 then-branch +%** @param implicit-#4 else-branch +\def\magyar@if@originalpagestyle#1#2{% + \begingroup + % article.cls calls \pagenumbering, which does a \gdef\thepage and + % \global\c@page=1. We'll cancel that below. + \let\magyar@@pagestyle@save@thepage\thepage + \edef\magyar@@pagestyle@save@c@page{\the\c@page\space} + \edef\magyar@@pagestyle@save@c@tocdepth{\the\c@tocdepth\space} + % Dat: no \paragraphmark or \subparagraphmark + % vvv Dat: already defined in latex.ltx + %\providecommand\sectionmark[1]{\relax} + %\providecommand\subsectionmark[1]{\relax} + #2\magyar@mark@fingerprint@def\@@magyar@now@marks + % + \def\ProvidesClass##1[##2]{}% + \def\NeedsTeXFormat##1[##2]{}% avoid ``can be used only in preamble'' + \long\def\DeclareOption##1##2{}% + \def\ExecuteOptions##1{}% + \def\ProcessOptions{}% + \def\DeclareOldFontCommand##1##2##3{}% + % + \def\magyar@gobbleopt[##1]{}% + % Dat: \newcommand etc. are not \global. Good. + \let\@onlypreamble\@gobble % In letter.cls . + \let\newdimen\@gobble + \let\newif\@gobble + \let\newskip\@gobble + \let\newmuskip\@gobble + \let\newcount\@gobble + \let\newbox\@gobble + \let\newtoks\@gobble + \let\newread\@gobble + \let\newwrite\@gobble + \let\newlaunguage\@gobble + \let\newlength\@gobble + \def\newcounter##1{\@ifnextchar[\magyar@gobbleopt{}}% + \def\setcounter##1##2{\@ifundefined{c@##1}{\@nocounterr{##1}}% + {\csname c@##1\endcsname##2\relax}} + %** Like \newcommand, but always overrides old values. + \def\magyar@defcommand{\@star@or@long\magyar@defcommand@low} + \def\magyar@defcommand@low##1{% + \begingroup + \escapechar\m@ne\xdef\@gtempa{\string##1}% + \endgroup + \expandafter\let\csname\@gtempa\endcsname\@undefined + \@star@or@long\new@command##1% + }% + \def\newcommand{\magyar@defcommand}% + \def\renewcommand{\magyar@defcommand}% + \def\magyar@defenvironment##1{% + \@ifundefined{##1}{}{% + \expandafter\let\csname ##1\endcsname\@undefined + \expandafter\let\csname end##1\endcsname\@undefined + }% + \@star@or@long\new@environment{##1}% + }% + \def\newenvironment{\magyar@defenvironment}% + \def\renewenvironment{\magyar@defenvironment}% + % + \ps@empty % Clean \@oddhead as of latex.ltx + \let\@mkboth\@gobbletwo + \let\@oddhead\@empty + \let\@evenhead\@empty + \let\@oddfoot\@empty + \let\@evenfoot\@empty + % + \def\input##1 {} % size10.clo etc. + \makeatletter \@@input #1 % + #2\magyar@mark@fingerprint@def\@@magyar@class@marks + %\message{AAA \meaning\@@magyar@now@marks}% + %\message{BBB \meaning\@@magyar@class@marks}% + \global\let\thepage\magyar@@pagestyle@save@thepage + \global\c@page\magyar@@pagestyle@save@c@page + \global\c@tocdepth\magyar@@pagestyle@save@c@tocdepth + \ifx\@@magyar@now@marks\@@magyar@class@marks + \endgroup\expandafter\@firstoftwo + \else + \endgroup\expandafter\@secondoftwo + \fi +} + +%\begingroup +%\magyar@mark@fingerprint@def\OOO +%\message{OOO \meaning\OOO}% +%\endgroup + +%** Branches based on whether the specified \pagestyle is active. +%** @param #1 tokens which change to the \pagestyle specified, e.g. +%** `\ps@headings'. +%** @param implicit-#2 then-branch +%** @param implicit-#3 else-branch +\def\magyar@if@currentpagestyle#1{% + \begingroup + \magyar@mark@fingerprint@def\@@magyar@now@marks + #1% + \magyar@mark@fingerprint@def\@@magyar@specified@marks + \ifx\@@magyar@now@marks\@@magyar@specified@marks + \endgroup\expandafter\@firstoftwo + \else + \endgroup\expandafter\@secondoftwo + \fi +} + +%** Redefine \@@magyar@setup@psheadings for #2.cls. +%** @param #1 is the expanded value of \CurrentOption (`magyar'). +\def\magyar@def@psheadings#1#2{% + \def\@@magyar@setup@psheadings{% + % SUXX: \show doesn't work here. + \ifx\@@magyar@overridden@psheadings\ps@headings + \@@magyar@error{assert: \string\let\string\ps@headings\string\@@magyar@overridden@psheadings\space was too early}% + \else\ifx\@@magyar@overridden@psheadings\@empty + \@@magyar@error{assert: \string\@@magyar@overridden@psheadings\space should be redefined}% + \else + \magyar@if@originalpagestyle{#2.cls}{\ps@headings}{% + % \ps@headings still has its original definition (as of #1.cls). + % + % For efficiency reasons, we make the following restriction. If the + % user does \selectlanguage{...} throughout the document, he should + % call \pagetsyle{...} after that to make the pagestyle + % language-dependent. + % + % !! add support for \thispagestyle in the preamble. + % !! don't add this if extras gets cleared. + \expandafter\addto\csname extras#1\endcsname{% + \babel@save\ps@headings + \let\ps@headings\@@magyar@overridden@psheadings + }% + \magyar@if@currentpagestyle{\ps@headings}{% + % The current \pagestyle has been selected by the current + % \ps@headings, i.e. \pagestyle{headings} is active. + \edef\reserved@a{\languagename}% + \edef\reserved@a{\expandafter\strip@prefix\meaning\reserved@a}% + \edef\reserved@b{#1}% + \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@a}% + \ifx\reserved@a\reserved@b + % Localize the current \pagestyle to Hungarian `headings'. + \@@magyar@overridden@psheadings + \fi + }{}% + }{}% + \fi\fi + }% +} + +\def\magyar@ulladik{ulladik0}% [Nn]ulladik, `0' at end is intentional + +\def\@@magyar@macro@appendixname{\appendixname} + +%** \thechapter (possibly with huordinal), dot, space. +\def\magyar@huordinal@chapterheaddot{% + \ifx\@chapapp\@@magyar@appendixname \thechapter\hbox{\magyar@opt@@titleskip}% appendixdot=no + \else\ifx\@chapapp\@@magyar@macro@appendixname \thechapter.~% + \else\ifnum\magyar@opt@@chapternumber=1 \@huordinal\c@chapter~% + \else\ifnum\magyar@opt@@chapternumber=2 \@Huordinal\c@chapter~% + \else \thechapter.~% + \fi\fi\fi\fi +} + +%** \thepart (possibly with huordinal), dot, space. +\def\magyar@huordinal@partheaddot{% + \ifnum\magyar@opt@@partnumber=1 \@huordinal\c@part~% + \else\ifnum\magyar@opt@@partnumber=2 \@Huordinal\c@part~% + \else \thepart.~% + \fi\fi +} + +%** Emits the rule to the running head. Must put something of zero width +%** to the horizontal list. +%** @param #1 0: even page, 1: odd page, 3: page w/o [twoside] +\def\@@magyar@headrule#1{} +\def\@@magyar@slshape{}% running head is not slanted + +\ifx\magyar@opt@@classmod\@empty + \let\@@magyar@ifclassloaded\@ifclassloaded +\else + \def\@@magyar@ifclassloaded#1#2{% force specific class + \def\reserved@a{#1}% + \ifx\reserved@a\magyar@opt@@classmod #2\fi + } +\fi + +\@@magyar@ifclassloaded{amsbook}{% + \let\magyar@hunumbers@errmsg\@empty + \let\@@magyar@orig@makechapterhead\@makechapterhead + \def\@makechapterhead#1{% + \begingroup + \let\@@magyar@orig@centerline\centerline + \def\centerline##1{% + \@@magyar@orig@centerline{% + \normalsize\mdseries + \ifx\chaptername\appendixname % We're in the appendix. + \ifx\@@magyar@appendixname\@empty + % print a dot in the appendix only if appendixdot=yes + \thechapter.~% + \else + \thechapter\hbox{\magyar@opt@@titleskip}% + \fi + \else\ifnum\magyar@opt@@chapternumber=1 + \uppercase\@xp{\@huordinal\c@chapter}~% + \else\ifnum\magyar@opt@@chapternumber=2 + \uppercase\@xp{\@Huordinal\c@chapter}~% + \else\thechapter.~% + \fi\fi\fi + \uppercase\@xp{\chaptername}% + }% + }% + \@@magyar@orig@makechapterhead{#1}% + \endgroup + }% + \let\@@magyar@orig@chapter\@chapter + \def\@chapter{% + \let\@@magyar@orig@chapter@typeout\typeout + \def\typeout##1{% + % Original: \typeout{\chaptername\space\@secnumber} + \@@magyar@orig@chapter@typeout{% + \ifnum\c@secnumdepth<\z@ + \chaptername\space + \else + \thechapter\ifx\chaptername\appendixname\else.\fi + \space\chaptername + \fi + }% + \let\typeout\@@magyar@orig@chapter@typeout + }% + \@@magyar@orig@chapter + }% + % Just to be sure, no need for this in amsbook.cls 2004/08/06 + \@ifundefined{tocpart}{\let\tocpart\tocsection}{} + % TODO(pts): Override only parts of \@part + \def\@part[#1]#2{% + \ifnum \c@secnumdepth >-2\relax \refstepcounter{part}% + % TODO(pts): What does \tocpart do for a non-hungarian \tableofcontents? + \addcontentsline{toc}{part}{\protect\tocpart{\partname}{\thepart}% + {#1}}% + \else + \addcontentsline{toc}{part}{#1}\fi + \begingroup\centering + \ifnum \c@secnumdepth >-2\relax + {\fontsize{\@xviipt}{22}\bfseries + \ifnum\magyar@opt@@partnumber=1 \@huordinal\c@part~% + \else\ifnum\magyar@opt@@partnumber=2 \@Huordinal\c@part~% + \else\thechapter.~% + \fi\fi + \partname + } \vskip 20\p@ \fi + \fontsize{\@xxpt}{25}\bfseries + #1\vfil\vfil\endgroup \newpage\thispagestyle{empty}} +}{} + +\@@magyar@ifclassloaded{book}{% + \let\magyar@hunumbers@errmsg\@empty + % Headings: inserting dots, changing orders + %\def\@@magyar@appendixname{\appendixname}% by appendixdot= + \def\@@magyar@overridden@psheadings{% + \if@twoside + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\@@magyar@headrule0\thepage\hfil\@@magyar@slshape\leftmark}% + \def\@oddhead {\@@magyar@headrule1{\@@magyar@slshape\rightmark}\hfil\thepage}% + \let\@mkboth\markboth + \def\chaptermark##1{% + \markboth {\MakeUppercase{% + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter% Dat: mainmatter only in book.cls, not in report.cls + \magyar@huordinal@chapterheaddot + \@chapapp.\magyar@opt@@hdrtitleskip% \ % + \fi + \fi + ##1}}{}}% + \def\sectionmark##1{% + \markright {\MakeUppercase{% + \ifnum \c@secnumdepth >\z@ + \thesection.\magyar@opt@@hdrtitleskip% \ % + \fi + ##1}}}% + \else + \let\@oddfoot\@empty + \def\@oddhead{\@@magyar@headrule3{\@@magyar@slshape\rightmark}\hfil\thepage}% + \let\@mkboth\markboth + \def\chaptermark##1{% + \markright {\MakeUppercase{% + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \magyar@huordinal@chapterheaddot + \@chapapp.\magyar@opt@@hdrtitleskip% \ % + \fi + \fi + ##1}}}% + \fi + }% + \expandafter\magyar@def@psheadings\expandafter{\CurrentOption}{book}% + % Part: inserting dot, changing order, toc + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\@part + \def\@part[#1]#2{% book + \ifnum \c@secnumdepth >-2\relax + \refstepcounter{part}% + \ifnum\magyar@opt@@partnumber>0 \protected@edef\@currentlabel{\@huordinal\c@part}\fi + \addcontentsline{toc}{part}{\thepart.\hspace{1em}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi + \markboth{}{}% + {\centering + \interlinepenalty \@M + \normalfont + \ifnum \c@secnumdepth >-2\relax + \huge\bfseries \magyar@huordinal@partheaddot\partname% hu + \csname par\endcsname + \vskip 20\p@ + \fi + \Huge \bfseries #2\csname par\endcsname}% + \@endpart}} + % Chapter: dot, changing typeout, toc + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\@chapter + \def\@chapter[#1]#2{% !! don't \def, but \let, other places, too + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \refstepcounter{chapter}% + \typeout{\thechapter\ifx\@chapapp\@@magyar@appendixname\else.\fi\space\@chapapp.}% + \ifx\@chapapp\@@magyar@appendixname + % \@gobble gobbles the dot emitted by \numberline. + \addcontentsline{toc}{chapter}{\protect\numberline{\thechapter\protect\@gobble}#1}% + \else + \addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}#1}% + \fi + \ifx\@chapapp\@@magyar@appendix@chapapp\else + \ifnum\magyar@opt@@chapternumber>0 \protected@edef\@currentlabel{\@huordinal\c@chapter}\fi + \fi + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \chaptermark{#1}% + \addtocontents{lof}{\protect\addvspace{10\p@}}% + \addtocontents{lot}{\protect\addvspace{10\p@}}% + \if@twocolumn + \@topnewpage[\@makechapterhead{#2}]% + \else + \@makechapterhead{#2}% + %\csname par\endcsname + \@afterheading % Imp: why doesn't it work? + \fi}} + \if0\magyar@opt@@chapterhead\else + % Chapter: dot, changing order + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\@makechapterhead + \def\@makechapterhead#1{% + \vspace*{50\p@}% + {\parindent \z@ \raggedright \normalfont + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \huge\bfseries + \magyar@huordinal@chapterheaddot \@chapapp{}% + \csname par\endcsname\nobreak + \vskip 20\p@ + \fi + \fi + \interlinepenalty\@M + \Huge \bfseries #1\csname par\endcsname\nobreak + \vskip 40\p@ + }}% + }% + \fi +}{} + +\@@magyar@ifclassloaded{report}{% + \let\magyar@hunumbers@errmsg\@empty + %\def\@@magyar@appendixname{\appendixname}% by appendixdot= + % Headings: inserting dots, changing orders + \def\@@magyar@overridden@psheadings{% + \if@twoside + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\@@magyar@headrule0\thepage\hfil\@@magyar@slshape\leftmark}% + \def\@oddhead {\@@magyar@headrule1{\@@magyar@slshape\rightmark}\hfil\thepage}% + \let\@mkboth\markboth + \def\chaptermark##1{% + \markboth {\MakeUppercase{% + \ifnum \c@secnumdepth >\m@ne + \magyar@huordinal@chapterheaddot + \@chapapp.\magyar@opt@@hdrtitleskip% \ % + \fi + ##1}}{}}% + \def\sectionmark##1{% + \markright {\MakeUppercase{% + \ifnum \c@secnumdepth >\z@ + \thesection.\magyar@opt@@hdrtitleskip% \ % + \fi + ##1}}}% + \else + \let\@oddfoot\@empty + \def\@oddhead{% + \@@magyar@headrule3{\@@magyar@slshape\rightmark}\hfil\thepage}% + \let\@mkboth\markboth + \def\chaptermark##1{% + \markright{\MakeUppercase{% + \ifnum \c@secnumdepth >\m@ne + \magyar@huordinal@chapterheaddot + \@chapapp.\magyar@opt@@hdrtitleskip% \ % + \fi + ##1}}}% + \fi + }% + \expandafter\magyar@def@psheadings\expandafter{\CurrentOption}{report}% + % Chapter: dot, changing typeout, toc + % Part... + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\@chapter + \def\@chapter[#1]#2{% + \ifnum \c@secnumdepth >\m@ne + \refstepcounter{chapter}% + \typeout{\thechapter\ifx\@chapapp\@@magyar@appendixname\else.\fi\space\@chapapp.}% + \ifx\@chapapp\@@magyar@appendixname + % \@gobble gobbles the dot emitted by \numberline. + \addcontentsline{toc}{chapter}{\protect\numberline{\thechapter\protect\@gobble}#1}% + \else + \addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}#1}% + \fi + \ifx\@chapapp\@@magyar@appendix@chapapp\else + \ifnum\magyar@opt@@chapternumber>0 \protected@edef\@currentlabel{\@huordinal\c@chapter}\fi + \fi + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \chaptermark{#1}% + \addtocontents{lof}{\protect\addvspace{10\p@}}% + \addtocontents{lot}{\protect\addvspace{10\p@}}% + \if@twocolumn + \@topnewpage[\@makechapterhead{#2}]% + \else + \@makechapterhead{#2}% + \@afterheading + \fi}% + \babel@save\@part + \def\@part[#1]#2{% report; added at Fri Jul 23 11:45:57 CEST 2004 + \ifnum \c@secnumdepth >-2\relax + \refstepcounter{part}% + \ifnum\magyar@opt@@partnumber>0 \protected@edef\@currentlabel{\@huordinal\c@part}\fi + \addcontentsline{toc}{part}{\thepart.\hspace{1em}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi + \markboth{}{}% %%%%% \l@chapter in report.cls + {\centering + \interlinepenalty \@M + \normalfont + \ifnum \c@secnumdepth >-2\relax + \huge\bfseries \magyar@huordinal@partheaddot\partname% hu + \csname par\endcsname + \vskip 20\p@ + \fi + \Huge \bfseries #2\csname par\endcsname}% + \@endpart}% + } + \if0\magyar@opt@@chapterhead\else + % Chapter: dot, changing order + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\@makechapterhead + \def\@makechapterhead#1{% + \vspace*{50\p@}% + {\parindent \z@ \raggedright \normalfont + \ifnum \c@secnumdepth >\m@ne + \huge\bfseries + \magyar@huordinal@chapterheaddot \@chapapp{}% + \vskip 20\p@ + \fi + \interlinepenalty\@M + \Huge \bfseries #1\csname par\endcsname\nobreak + \vskip 40\p@ + }}% + }% + \fi +}{} + +\@@magyar@ifclassloaded{article}{% + % article.cls has no \chapter. We'll hook \part below though. + \let\magyar@hunumbers@errmsg\@empty + % Headings: inserting dots + % In order for this to take effect, \pagestyle{plain} should be put below + % \begin{document}. + \def\@@magyar@overridden@psheadings{% + \if@twoside + \let\@oddfoot\@empty\let\@evenfoot\@empty + % Dat: by pts: \slshape -> \relax + \def\@evenhead{\@@magyar@headrule0\thepage\hfil\@@magyar@slshape\leftmark}% + \def\@oddhead {\@@magyar@headrule1{\@@magyar@slshape\rightmark}\hfil\thepage}% + \let\@mkboth\markboth + \def\sectionmark##1{% + \markboth {\MakeUppercase{% + \ifnum \c@secnumdepth >\z@ + \thesection.\magyar@opt@@hdrtitleskip + \fi + ##1}}{}}% + \def\subsectionmark##1{% + \markright {% + \ifnum \c@secnumdepth >\@ne + \thesubsection.\magyar@opt@@hdrtitleskip + \fi + ##1}}% + \else + \let\@oddfoot\@empty + \def\@oddhead{\@@magyar@headrule3{\@@magyar@slshape\rightmark}\hfil\thepage}% + \let\@mkboth\markboth + \def\sectionmark##1{% + \markright {\MakeUppercase{% + \ifnum \c@secnumdepth >\m@ne + \thesection.\magyar@opt@@hdrtitleskip + \fi + ##1}}} + \fi}% + \expandafter\magyar@def@psheadings\expandafter{\CurrentOption}{article}% + \expandafter\addto\csname extras\CurrentOption\endcsname{% + \babel@save\@part + \def\@part[#1]#2{% article % added at Fri Jul 23 11:45:57 CEST 2004 + \ifnum \c@secnumdepth >\m@ne + \refstepcounter{part}% + \ifnum\magyar@opt@@partnumber>0 \protected@edef\@currentlabel{\@huordinal\c@part}\fi + \addcontentsline{toc}{part}{\thepart.\hspace{1em}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi + {\parindent \z@ \raggedright + \interlinepenalty \@M + \normalfont + \ifnum \c@secnumdepth >\m@ne + \Large\bfseries \magyar@huordinal@partheaddot\partname% hu + \csname par\endcsname\nobreak + \fi + \huge \bfseries #2% + \markboth{}{}\csname par\endcsname}% + \nobreak + \vskip 3ex + \@afterheading}}% +}{} + +\@@magyar@ifclassloaded{letter}{% + % letter.cls has no \part or \chapter. No need to hook anything here, but + % we make \magyar@hunumbers@errmsg just to pacify + % `\PassOptionsToPackage{defaults=prettiest}{magyar.ldf}'. + \let\magyar@hunumbers@errmsg\@empty + % Headings: inserting dots + % In order for this to take effect, \pagestyle{plain} should be put below + % \begin{document}. + \def\@@magyar@overridden@psheadings{% + \if@twoside + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@oddhead{\@@magyar@headrule3\@@magyar@slshape\headtoname{:} \ignorespaces\toname + \hfil \@date + \hfil \thepage.~\pagename}% + \let\@evenhead\@oddhead + \else + \let\@oddfoot\@empty + \def\@oddhead{\@@magyar@headrule3\@@magyar@slshape\headtoname{:} \ignorespaces\toname + \hfil \@date + \hfil \thepage.~\pagename}% + \fi}% + \expandafter\magyar@def@psheadings\expandafter{\CurrentOption}{letter}% +}{} +\@gobble +{^}% + +% --- mond= + +\if0\magyar@opt@@mond \@@magyar@skiplong\fi +%** Dat: `--\enspace' would be too much +%** Use this in the beginning of the paragraph. +\def\@@magyar@mond{% + % Dat: \noindent after \subsection in article.cls + % Dat: \indent after \subsection in amsart.cls (\@noskipsecfalse) + % vvv Dat: strange: \ifvmode anf \if@noskipsec. + \ifvmode\if@noskipsec\leavevmode\fi\par\vskip-\parskip + \else\@noskipsecfalse\par\vskip-\parskip\fi + \leavevmode--\hbox{ }} +\ifnum\magyar@opt@@mond \expandafter\ifx\csname mond\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \let\mond\@@magyar@mond +\fi +\@gobble +{^}% + +% --- hang= + +\if0\magyar@opt@@hang \@@magyar@skiplong\fi +%** Usage: \hang{-- } Foo\par +\def\@@magyar@hang#1{% + \begingroup + \setbox0\hbox{#1}% + \advance\linewidth-\wd0 % not \hsize + \advance\@totalleftmargin\wd0 + \edef\reserved@a{\parshape=1 \the\@totalleftmargin\space\space\the\linewidth\space}% + \par\noindent\kern-\wd0 \box0 % Dat: \box0 destroys \wd0 + \expandafter\endgroup\expandafter\begingroup\reserved@a + \let\hang@@par\par + \def\par{\hang@@par\endgroup}% OK, works even inside \begin{quotation} + %\def\par{\endgroup\par}% doesn't work, restores \parshape too early + \ignorespaces +}% +\ifnum\magyar@opt@@hang \expandafter\ifx\csname hang\endcsname\relax1\fi>1 % 21, 2, 11, 1 + \let\hang\@@magyar@hang +\fi +\@gobble +{^}% + +% vvv hyphenmins= + +\ifx\magyar@opt@@hyphenmins\@empty\else + \edef\reserved@a{\noexpand\@namedef{\CurrentOption hyphenmins}{\magyar@opt@@hyphenmins}} + \reserved@a +\fi + +% !! + +%\def\skipfoo #1foo {% +% \ifx#1\hfuzz\else +% (#1)% +% \expandafter\skipfoo +% \fi +%} + + +% vvv cjhebrewfix= % by pts@fazekas.hu at Tue Apr 19 18:26:54 CEST 2005 +% thanks to Zoltn Hamar for reporting the problem +% Dat: the ultimate solution is active=onlycs, but it limits other +% functionality +% Dat: use \def\h{\cjRL} in the preamble to abbreviate \cjRL +% wrong: \let\h\cjRL +% wrong: \newcommand{\h}[1]{\cjRL{#1}} +% Dat: cjhebrew uses the following strings for typesetting Hebrew letters: +% ' b g d h w z .h .t y k K l m M n N s ` p P .s .S q r ,s +s t * a a: +% /a e i o O u U E E: A A: | * : ; -- +% Dat: headings in `\pagestyle{headings} \section{(\cjRL{`l})}' doesn't work +% as expected, because \MakeUppercase capitalizes the L, too. +% Solution #1: +% \DeclareRobustCommand\mycjcommand{\cjRL{`l}} +% \section{(\mycjcommand)} +% Solution #2: (won't convert any heading to uppercase) +% % change the definition of \ps@headings, remove \MakeUppercase +% \makeatletter \def\ps@headings{% +% \let\@oddfoot\@empty \let\@mkboth\markboth +% \def\@oddhead{{\slshape\rightmark}\hfil\thepage}% +% \def\sectionmark##1{\markright {\iffalse\MakeUppercase\fi{% +% \ifnum \c@secnumdepth >\m@ne \thesection\quad \fi##1}}}} +\if0\magyar@opt@@cjhebrewfix \@@magyar@skiplong\fi +% Dat: \cjRL{`l} in cjhebrew.sty should typeset two letters, but typesets +% only one if ` is \active. Use this code to fix it. +% Imp: also fix in command arguments etc. Change catcode later. +\if1\magyar@opt@@cjhebrewfix % =onlyouter +% Dat: this doesn't work in the argument of \section etc., but it allows +% LaTeX commands (\) in the arg of \cjRL +\def\@@magyar@cjhebrewfix{% + \let\@@magyar@orig@cjRL\cjRL + \def\cjRL{\begingroup\catcode\string``=12 \@@magyar@cjRL@low}% + \def\@@magyar@cjRL@low##1{\@@magyar@orig@cjRL{##1}\endgroup}} +\else % =yes +% Dat: this works in the argument of \section etc., but it doesn't allow +% LaTeX commands (\) in the arg of \cjRL +\def\reserved@b{\protect} +\edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b} +%\show\reserved@b +\edef\reserved@a{% + \noexpand\def\noexpand\@@magyar@cjhebrew@skipa##1\reserved@b{% + \noexpand\ifx##1\noexpand\hfuzz\noexpand\@empty\noexpand\else + ##1%(##1)% + \noexpand\expandafter\noexpand\@@magyar@cjhebrew@skipa + \noexpand\fi}% + \noexpand\def\noexpand\@@magyar@cjhebrew@skipb##1\noexpand\hfuzz{% Dat: this removes all `\protect ' + \noexpand\@@magyar@cjhebrew@skipa##1\reserved@b\noexpand\hfuzz\reserved@b}} +\reserved@a +\def\@@magyar@cjhebrewfix{% + \let\@@magyar@orig@cjRL\cjRL + %\let\@@magyar@orig@cjRL\bf + \DeclareRobustCommand\cjRL[1]{\begingroup + \toks@{##1}% + %\showthe\toks@ + \edef\reserved@a{\the\toks@}% + \edef\reserved@a{\expandafter\strip@prefix\meaning\reserved@a}% + % Dat: we're almost complete here, but 1st we want to remove all + % instances of `\protect ' (catcodes 12 and 10), which were inserted + % into \firstmark, i.e. with \section{A\cjRL{`l}B}, \firstmark + % becomes: `{}{\protect \csname foreignlanguage \endcsname {magyar}{\protect \MakeUppercase {1\hskip 1em\relax A\protect \cjRL {\protect `l}B}}}' + \edef\reserved@a{\expandafter\@@magyar@cjhebrew@skipb\reserved@a\hfuzz}% + %\show\reserved@a + \expandafter\@@magyar@orig@cjRL\expandafter{\reserved@a}\endgroup}} +\fi +\AtBeginDocument{\ifx\cjRL\@undefined\else\@@magyar@cjhebrewfix\fi} +\@gobble +{^}% + +% vvv varioref= + +\if0\magyar@opt@@varioref \@@magyar@skiplong\fi +\expandafter\addto\csname extras\CurrentOption\endcsname{% + \@@magyar@setup@varioref} % Dat: we are we late enough so we override varioref.sty +% vvv don't apply changes if varioref.sty wasn't loaded +\AtBeginDocument{\expandafter\ifx\csname vpagerefrange\endcsname\relax + \let\@@magyar@setup@varioref\@empty\fi} +\def\@@magyar@setup@varioref{% Dat: must be a separate macro for suggestions= not to find our \reftextfaceafter etc. + \def\reftextfaceafter {\reftextvario{a t\'ul\-ol\-da\-lon}{a k\"o\-vet\-kez\H{o} ol\-da\-lon}}% + \def\reftextfacebefore{\reftextvario{a t\'ul\-ol\-da\-lon}{az el\H{o}\-z\H{o} ol\-da\-lon}}% + \def\reftextafter {a k\"o\-vet\-kez\H{o} ol\-da\-lon}% + \def\reftextbefore {az el\H{o}\-z\H{o} ol\-da\-lon}% + \def\reftextcurrent {ezen az ol\-da\-lon}% + \def\reftextfaraway##1{a~\csname @@magyar@az@lowxu\endcsname{\pageref{##1}}.~ol\-da\-lon}% + \def\reftextpagerange##1##2{a~\csname @@magyar@az@lowxu\endcsname{\pageref{##1}}% + --\pageref{##2}.~ol\-da\-la\-kon}% + \def\reftextlabelrange##1##2{{}\csname @@magyar@told\endcsname\ref{##1}+tol{} + \ref{##2}-ig}% Dat: `{}' is here for anti-\capitalize +} +\@gobble +{^}% + +% vvv fancyhdr= +% +% Dat: magyar.ldf has to be loaded first, otherwise it cannot fix +% `\usepackage{fancyhdr} \pagestyle{fancy}' + +\if0\magyar@opt@@fancyhdr \@@magyar@skiplong\fi +\expandafter\ifx\csname ps@fancy\endcsname\relax + % Emit a warning if \pagestyle{fancy} is used after this. + % The original definition: \def\ps@fancy{\@fancyplainfalse\ps@@fancy} + \def\@@magyar@@ps@fancy{\@fancyplainfalse\ps@@fancy}% +\else + \addto\ps@fancy{% works for article.cls, report.cls and book.cls + \@ifundefined{chapter}{% + % article: + % > \sectionmark=macro: + %#1->\markboth {\MakeUppercase {\ifnum \c@secnumdepth >\z@ + %\thesection \hskip 1em\relax \fi #1}}{}. + \def\sectionmark#1{\markboth{\MakeUppercase{\ifnum \c@secnumdepth>\z@ + \thesection.\magyar@opt@@hdrtitleskip \fi #1}}{}}% + % vvv Imp: do we need \if@twoside to set \subsectionmark here? + % #1->\markright {\ifnum \c@secnumdepth >\@ne \thesubsection + % \hskip 1em\relax \fi #1}. + \def\subsectionmark#1{\markright {\ifnum \c@secnumdepth >\@ne + \thesubsection.\magyar@opt@@hdrtitleskip \fi #1}}% + }{\def\chaptermark#1{ + \markboth{\MakeUppercase{\ifnum \c@secnumdepth>\m@ne + % report.cls doesn't have \if@mainmatter, so we replace it with \iftrue + \@gobble\iftrue % balance for quick skipping + \@@magyar@ifmainmatter % must be macro if quick skipping + \magyar@huordinal@chapterheaddot + \@chapapp.\magyar@opt@@hdrtitleskip + \fi % for \if@mainmatter + \fi#1}}{}}% + \def\sectionmark#1{\markright{\MakeUppercase{\ifnum \c@secnumdepth>\z@ + \thesection.\magyar@opt@@hdrtitleskip \fi#1}}}}}% + \def\@@magyar@@ps@fancy{\relax}% must be done after suggestions= +\fi +% This definition must be outside \iffalse. +\def\@@magyar@ifmainmatter{% + \csname \ifx\if@mainmatter\@undefined iftrue\else if@mainmatter\fi + \endcsname} +\@gobble +{^}% + +% vvv ntheoremfix= + +%** Fix for the `! Undefined control sequence. \select' error message with +%** ntheorem.sty +%** +%** The reason for the error is that magyar.ldf emits +%** \select@language{magyar} into .thm files (as well as .toc, .lof, .lot +%** etc. files), and LaTeX cannot read those files without \makeatletter +%** because of the @ in the \select@language command. +%** +%** Our solution: add \makeatletter somewhere before \@input{\jobname.thm} to +%** the macro which reads the .thm file (\thm@processlist) in ntheorem.sty . +\if0\magyar@opt@@ntheoremfix \@@magyar@skiplong\fi + \def\magyar@@ntheoremfix{% + \expandafter\ifx\csname ver@ntheorem.sty\endcsname\relax\else + \ifx\thm@processlist\@undefined\else + % This doesn't work, because the body of \thm@processlist contains # + %\expandafter\def\expandafter\thm@processlist\expandafter{% + % \expandafter\begingroup\expandafter\makeatletter + % \thm@processlist\endgroup}% + \expandafter\@temptokena\expandafter{% + \expandafter\begingroup\expandafter\makeatletter + \thm@processlist\endgroup}% + \edef\thm@processlist{\the\@temptokena}% + \fi + \fi + } + \AtBeginDocument{\magyar@@ntheoremfix} + \@gobble +{^}% + +% vvv extras=, must be last + +\ifnum\magyar@opt@@extras=0 + % Dat: \extrasmagyar might break compatibility with future LaTeX packages. + % Use this option to turn all of them off, for debugging purposes. + \expandafter\let\csname extras\CurrentOption\endcsname\@empty + \expandafter\let\csname noextras\CurrentOption\endcsname\@empty +\fi + +% --- Finish + +\ldf@finish\CurrentOption% \input \CurrentOption.cfg + +% !! doc: (\string!) +% !! doc: \umlautlow is much more important in OT1 cmr fonts than in T1 +% !! %** @example rtelmezs\/bellts +% \def\per{/\penalty\exhyphenpenalty\hskip\z@skip} +% !! \itemize identation +% !! layout.sty +%\DeclareOption{magyar}{% +% \def\Headertext{Fejl\'ec} +% \def\Bodytext{A dokumentum teste\qquad} +% \def\Footertext{L\'abl\'ec} +% \def\MarginNotestext{Sz\'el-\\jegyzet} +% \def\oneinchtext{1 inch} +% \def\notshown{nem l\'atszik} +% } +% !! vvv this w/ and w/o nathb.sty: $H_{`symm}$, $H_``symm $ +%\let\@@magyar@saved@mathoptions@on\mathoptions@on +%\def\mathoptions@on{% overrides nath.sty +% \catcode``12 % deactivate +% \begingroup\lccode`~``\lowercase{\endgroup\def~}{\abbreviation}% +% % ^^^ \def`{\abbreviation}, but with active ` +% \@@magyar@saved@mathoptions@on +%} +% !! doc: hegyes`-szg +% !! option to detect new magyar.ldf from a TeX file +% !! book.cls \appendix \chapter, sub-numbers into TOC, need dot after `A. fggelk'? Gyurgyk recommends `1. fggelk'. +% !! \MathReal, frenchb.ldf, \nombre +% !! \told\ref{foo}+ban{}, if \foo expands to empty (no \section etc. in .tex file) +% !! french.ldf number decimal comma etc. +% !! \hunnewlabel should store `table', `figure', `section', `equation' etc. +% !! letter.cls +% !! should \newlabel emit a `.' ? (now doesn't) -- compatibility +% `\aref{ekezetek}.\ tblzat' needs explicit `.' +% !! alternative solutions for meny-nyi (possibly defining ligatures?) +% !! baseline grid? +% !! Bujdos`--Wettl: http://www.math.bme.hu/~wettl/plcv/pdf/BWfinal.pdf +% !! some comments not related to magyar.ldf, but to *hyph.tex etc. +% !! add their postpara symbols +% !! section title sizes +% !! baseline grid +% !! rigid \parskip=0pt unless in prospestus or other short doc with \parindent=0pt +% !! add their \leftmargini and variations +% !! substitute bold-extended fonts with bold fonts +% !! no page numbers on blank pages +% !! \hsize <= 24cc (or 20cc) => parindent:=1quad else 2quad +% !! length of last line of par... (break line) +% !! reduce vertical whitespace around \section +% +% !! \MathReal{1.25 cm} +% !! \H,\. in OT1 \texttt +% !! maybe \index{|run husort.pl} +% !! virtual fonts to support \umlauthigh and \umlautlow in T1 encoding +% fnt_def1: scaled size is relative (2^20==1), design size is absolute (same as in local TFM) +% disallowed DVI: bop,eop, >=243 +% down(2^19) moves down 10/2 pt if the design size is 10pt +% dimensions must be <2^24 (160pt, ~5.62cm) +% w=x=y=z=0 +% !! \begin{description} \bf -> \em ?, auto-dot +% !! \def\mdqon{\shorthandon{"}} \def\mdqoff{\shorthandoff{"}} (possibly deactivate `?' etc.) +% !! fix \initiate@active@char for other languages +% !! \addto\shorthandsspanish... +% !! spanish.ldf \es@activate, \if@safe@actives\then +% !! esperanto.ldf why? \declare@shorthand{system}{^}{\csname normal@char\string^\endcsname} +% !! add other low accents for umlaut=low: \. (i) and \' +% !! full amsart.cls compatibility?? +% !! huhyph.tex wrong \showhyphens{azthehe}% az-t-hehe +% !! huhyph.tex wrong zs-hehe +% !! huhyph.tex why sza-badstrand, but szbadsg-rand +% !! \index{foo|hyperpagearg{\textbf}} +% !! combine \magyar@opt@@titleskip, amstocnumskip and \magyar@post@... +% !! \begin{textqq} ? combined command and env +% !! tmagyar.tex \tableofcontents wide \section +% !! \restoreparindent in \item in \itemize +% \edef\restoreparindent{\parindent\the\parindent\relax} in \@listi +% !! 1848 mrcius+nak kzepe +% !! should \told insert \, ?? (no, only \told*??) +% !! \told45{-ed-hez} ?? +% !! \told{45}-ed-hez ?? +% !! \told45\od\hoz \told45+\od\hoz +% !! \told45+adik+val +ad+val etc. +% !! \azhuphy +% !! \huphy{-3331234.5678pF^{-1}} -> $-$3\,331\,234,5678\,pF^{-1} +% !! \huphy if non-Hungarian is the lang {,}->{.} +% !! \huphy ifmmode? +% !! french.ldf \CyrillicGuillemets +% !! french.ldf \LasyGuillemets +% !! huplain.bst editor = "Wizar{\BN dj} V. Oz and Mihalis Yannakakis", +% !! huplain.bst w/o magyar.ldf +% !! hyperref.sty bugfix when turning hyperref.sty on, \ref is spoiled: +% w/ or w/o magyar.ldf +% ! Argument of \@fifthoffive has an extra }. +% +% \par +% l.48 Ld. \ref{tab} +% !! > Kiprbltam, s tnyleg pontosan ugyanaz a fjl magyar.ldf (texmf fban) s +% > magyar-0510.ldf (aktulis knyvtrban) nven ms eredmnyt ad. +% (cjhebrew) +% !! a4wide.sty doesn't compile +% \documentclass[12pt,a4paper]{article} +% \usepackage{t1enc} +% \usepackage{times}% Imp: math mode +% \usepackage[magyar]{babel} +% \usepackage{graphicx} +% \usepackage[latin2]{inputenc} +% %\usepackage{a4wide}% SUXX: doesn't work with magyar.ldf +% \pagestyle{empty} +% \begin{document} +% !! % Imp: magyar.ldf: \textdt{tudja`=e}, \textdt{tudja`-e}; +% !! space in front of `;' is too large with \usepackage{times} +% \declare@shorthand{\CurrentOption}{;}{\magyar@thinspaced;} +% !! doc: `- not suitable in .bib files etc. +% !! \cite{foo,bar} -> `[2, 1]' increasing order preferred +% Imp: indent using the maximum footnotemark *** count on the current page +% Imp: generate ,,harminchrombl'' by \told{\@huordinal{33}}+bol etc. +% +% Dat: \mathcode`\,="013B % s gy a tizedes trtekben matematikai mdban sem lesz kz +% Dat: \mathchardef\comma="613B % a vesz (,) ami matematikai mdban elvlaszt karakterknt hasznlhat +% Dat: additive \PassOptionsToPackage{foo=bar}{magyar.ldf} +% Dat: for book.cls and article.cls: the user has to run \pagestyle{headings} after \selectlanguage{magyar} -- for performance reasons +% Dat: doc: \let\@@magyar@setup@psheadings\relax maybe needed in the preamble +% Dat: \pagestyle{headings} is forced \AtBeginDocument -- user should change it later +% Dat: babel.def assumes we have: \textquotedblright \textquoteright \ll \gg +% < > +% Dat: babel.def defines for OT1 and others: \quotedblbase \quotesinglbase +% \guillemotleft \guillemotright \guilsinglleft \guilsinglright \ij \IJ +% \dj \DJ \SS +% Dat: babel.def defines the following robust commands in math and text modes: +% \glq \grq \glqq \grqq \flq \frq \flqq \frqq +% Dat: OT1 encoding respects accents=low (\umlauthigh and \umlautlow), but T1 +% doesn't -- but we need T1 for hyphenation of accented words +% Dat: \usepackage{t1enc} is faster than \usepackage[T1]{fontenc} +% Dat: \languageattribute should be specified in the document preamble, and +% not changed again +% Dat: it is possible to have 1 letter, e.g \declare@shorthand{turkish}{=}{...} +% Dat: Babel \@activated emits a \PackageInfo entry +% Dat: (` `) is equivalent to (``), because TeX ignores spaces before macro +% arguments +% Dat: example of the so-called ``dual load'': +% \PassOptionsToPackage{frenchspacing=yes}{magyar.ldf} +% \PassOptionsToPackage{frenchspacing=no}{hungarian.ldf} +% \usepackage[hungarian,magyar]{babel} +% Dat: argument of \az and \told may not contain \if..., \else and \fi +% OK: works with article.cls: (mathbrk=fix) +% \noindent s ebbl a tovbbi hrom rsz terlete +% $\displaystyle{1\over3}-{1\over 4}={1\over 12}$, +% $\displaystyle{1\over 2}-{1\over 4}={1\over 4}$ s +% $\displaystyle{1\over 4}+\bigg({1\over 2}-{1\over 3}\bigg)={1\over 4}+{1\over 6}}=\displaystyle{5\over 12}$ +% terletegysg. +% OK: doc in magyarldf-doc.tex: enumeration in math, see $a,\ b$ in nath.sty +% OK: mathbrk=fix +\\+ (all binary ops and relations) in math, \nobreak\cdot, \nobreak\slash +% OK: footnote text indented, asterisks on pages +% OK: Kiss Eld\nobreak\,\nobreak--\,Nagy Pl ... +% OK: \partname in book.cls (seems to work now) +% OK: Els rsz +% OK: smartly disable active chars in preamble +% OK: \@inpenc@undefined defined and != latin2 => recommend \usepackage[latin2]{inputenc} +% OK: \encodingdefault != T1 => recommend \usepackage{t1enc} +% OK: Warning if \l@hungarian vs \l@magyar undefined +% OK: amsart.cls \listoftables overfull \hbox (\magyar@amslevelfix) +% OK: dzs-dzs +% OK: \expandafter\addto\csname extras\CurrentOption\endcsname{\bbl@frenchspacing} +% OK: provide \magyarhyphenmins +% OK: compatibility with latex.ltx, theorem.sty, ntheorem.sty, amsthm.sty +% OK: \PackageWarning if \magyarOptions defined too late +% OK: like frenchb.ldf \declare@shorthand{french}{;}{ +% OK: \told\ref{hellopart}+es{} rszt olvasd el. +% OK: \told appends suffixes to numbers +% OK: activeacute, activegrave babel options +% OK: even more parts made conditional +% OK: \@hunumeral \@huordinal \@Hunumeral \@Huordinal +% OK: negative numbers \told-5-nek, `mnusz kettedik' etc. +% OK: magyar.ldf defaults=hu-min (mathbrk=define) $x+116=\break x-97$ adds space only to BOL; added \nobreak before \discretionary -- and the problem was solved +% OK: fixed. varioref.sty (2001/09/04 v1.3c) mustn't be loaded with option +% [magyar], because that option contains a stupid \AtBeginDocument hook +% added to \extrasmagyar +% OK: Bujdos`--Wettl: add their {itemize} symbols and {enumerate} styles +% OK: spacing around excl. marks in math mode ! closing(5) -> punct(6) +% better solution (found in nath.sty): \def!{\mathchar20513\relax\mathopen{}\mathinner{}}, +% because it doesn't need braces +% No: \@makecaption in frenchb.ldf -> magyar.ldf + +\@@magyar@restcats +\endinput% of magyar.ldf diff --git a/src/thesis.kilepr b/src/thesis.kilepr new file mode 100644 index 0000000..3df15a3 --- /dev/null +++ b/src/thesis.kilepr @@ -0,0 +1,85 @@ +[General] +bib_extensions=.bib +bibliographyBackendAutoDetected= +bibliographyBackendUserOverride=BibTeX +def_graphic_ext= +img_extIsRegExp=false +img_extensions=.eps .jpg .jpeg .png .pdf .ps .fig .gif +kileprversion=3 +kileversion=2.9.93 +masterDocument= +name=thesis +pkg_extIsRegExp=false +pkg_extensions=.cls .sty .bbx .cbx .lbx +src_extIsRegExp=false +src_extensions=.tex .ltx .latex .dtx .ins + +[Tools] +MakeIndex= +QuickBuild= + +[item:content/abstract.tex] +archive=true +encoding=UTF-8 +highlight=LaTeX +mode=LaTeX + +[item:content/acknowledgement.tex] +archive=true +encoding=UTF-8 +highlight=LaTeX +mode=LaTeX + +[item:content/appendices.tex] +archive=true +encoding=UTF-8 +highlight=LaTeX +mode=LaTeX + +[item:content/closing.tex] +archive=true +encoding=UTF-8 +highlight=LaTeX +mode=LaTeX + +[item:content/create-functions.tex] +archive=true +encoding=UTF-8 +highlight=LaTeX +mode=LaTeX + +[item:content/introduction.tex] +archive=true +encoding=UTF-8 +highlight=LaTeX +mode=LaTeX + +[item:content/preparation.tex] +archive=true +encoding=UTF-8 +highlight=LaTeX +mode=LaTeX + +[item:content/results.tex] +archive=true +encoding=UTF-8 +highlight=LaTeX +mode=LaTeX + +[item:content/theory.tex] +archive=true +encoding=UTF-8 +highlight=LaTeX +mode=LaTeX + +[item:thesis.kilepr] +archive=true +encoding= +highlight= +mode= + +[item:thesis.tex] +archive=true +encoding=UTF-8 +highlight=LaTeX +mode=LaTeX diff --git a/src/thesis.tex b/src/thesis.tex new file mode 100644 index 0000000..80acb52 --- /dev/null +++ b/src/thesis.tex @@ -0,0 +1,111 @@ +% !TeX spellcheck = hu_HU +% !TeX encoding = UTF-8 +% !TeX program = xelatex +%\documentclass[11pt,a4paper,oneside]{report} % Single-side +\documentclass[11pt,a4paper,twoside,openright]{report} % Duplex + +\input{include/packages} + +% Set the main variables +\newcommand{\vikszerzoVezeteknev}{Torma} +\newcommand{\vikszerzoKeresztnev}{Krist\'of} + +\newcommand{\tdkszerzoB}{Pünkösd Marcell} + +\newcommand{\vikkonzulensAMegszolitas}{Dr.~} +\newcommand{\vikkonzulensAVezeteknev}{Maliosz} +\newcommand{\vikkonzulensAKeresztnev}{Markosz} + +\newcommand{\vikkonzulensBMegszolitas}{Dr.~} +\newcommand{\vikkonzulensBVezeteknev}{Simon Csaba} +\newcommand{\vikkonzulensBKeresztnev}{} + +\newcommand{\vikkonzulensCMegszolitas}{} +\newcommand{\vikkonzulensCVezeteknev}{} +\newcommand{\vikkonzulensCKeresztnev}{} + +\newcommand{\vikcim}{Madárhang azonosító és riasztó felhő-natív rendszer} % Cím +\newcommand{\viktanszek}{\bmetmit} % Tanszék +\newcommand{\vikdoktipus}{\msc} % Dokumentum típusa (\bsc vagy \msc) +\newcommand{\vikmunkatipusat}{szakdolgozatot} % a "hallgató nyilatkozat" részhez: szakdolgozatot vagy diplomatervet + +%\input{include/tdk-variables} +%\newcommand{\szerzoMeta}{\vikszerzoVezeteknev{} \vikszerzoKeresztnev} % egy szerző esetén +\newcommand{\szerzoMeta}{\vikszerzoVezeteknev{} \vikszerzoKeresztnev, \tdkszerzoB} % két szerző esetén + +%Language configuration -- choose one +% Beállítások magyar nyelvű dolgozathoz +\input{include/thesis-hu} +% Settings for English documents +%\input{include/thesis-en} + +\input{include/preamble} + +%-------------------------------------------------------------------------------------- +% Table of contents and the main text +%-------------------------------------------------------------------------------------- +\begin{document} + +\pagenumbering{gobble} + +%These includes define guidelines -- remove these +%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +%\include{include/guideline} +%\include{include/project} + +\selectthesislanguage + +%Titlepage -- choose one from below +%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\input{include/titlepage} % Szakdolgozat/Diplomaterv címlap +%\include{include/titlepage-tdk} % TDK címlap +%\include{include/titlepage-otdk} % OTDK címlap + + +% Table of Contents +%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\tableofcontents\vfill +\clearpage + + +% Declaration and Abstract +%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +%\input{include/declaration} %Hallgatói nyilatkozat -- TDK és OTDK esetén törlendő! +\input{content/abstract} %Összefoglaló -- TDK és OTDK esetén nem kötelező + + +% The main part of the thesis +%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\pagenumbering{arabic} + +%import your own content +\input{content/introduction} +\input{content/theory} +\input{content/preparation} +\input{content/create-functions} +\input{content/results} +\input{content/closing} + + +% Acknowledgements +%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\input{content/acknowledgement} + + +% List of Figures, Tables +%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +%\listoffigures\addcontentsline{toc}{chapter}{\listfigurename} +%\listoftables\addcontentsline{toc}{chapter}{\listtablename} + + +% Bibliography +%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\addcontentsline{toc}{chapter}{\bibname} +\bibliography{bib/mybib} + +% Appendix +%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\input{content/appendices} + +%\label{page:last} +\end{document}