summaryrefslogtreecommitdiff
path: root/support
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2024-08-29 03:03:05 +0000
committerNorbert Preining <norbert@preining.info>2024-08-29 03:03:05 +0000
commit0c37cf67ade4182d382c384e595a24ebb022fa63 (patch)
treec3bb4966e80077cd13b3e075025e9190cfe45b22 /support
parent8949f3077cb0d7b4f471e4ef1d49b8da436ebbc4 (diff)
CTAN sync 202408290303
Diffstat (limited to 'support')
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/Changes86
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/LICENSE379
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/MANIFEST44
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/Makefile.PL71
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/Makefile.TDS35
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/README9
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/dist.ini28
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser.pm366
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Author.pm429
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Entry.pm435
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/notes26
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/00-load.t11
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/01-parse.t36
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/02-parse_string.t39
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/03-parse_entry.t102
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/04-entry.t42
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/05-author.t68
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/06-parse_complex.t46
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/07-parse_englishbib.t42
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/08-parse_large.t24
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/09-complex.t42
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/10-funnyname.t61
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/11-split_braced.t28
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/12-von_token.t12
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/13_output.t39
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/14-extratext.t65
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/15-capitalization.t72
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/bibs/01.bib7
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/bibs/06.bib27
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/bibs/09-complex.bib11
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/bibs/10-funnyname.bib10
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/bibs/14-extratext.bib22
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/bibs/braces.bib21
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/bibs/endnote.txt6
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/bibs/engineering_village.txt24
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/bibs/english.bib55
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/bibs/mathscinet.txt40
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/bug66325.t71
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/bug67419.t29
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/cleaned_field.t143
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/pod-coverage.t18
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/pod.t12
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/release-pod-coverage.t21
-rw-r--r--support/bibtexperllibs/BibTeX-Parser/t/release-pod-syntax.t15
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/Changes27
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/LICENSE375
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/MANIFEST17
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/Makefile.PL51
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/Makefile.TDS53
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/README13
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/dist.ini16
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/head.ltx28
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/latex-tounicode.pdfbin191418 -> 0 bytes
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode.pm778
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode/Tables.pm726
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.173
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.pdfbin2226 -> 0 bytes
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/script/convert.pl156
-rwxr-xr-xsupport/bibtexperllibs/LaTeX-ToUnicode/script/ltx2unitxt169
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/t/convert.t136
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-coverage.t21
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-syntax.t15
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/t/release-synopsis.t16
-rw-r--r--support/bibtexperllibs/LaTeX-ToUnicode/weaver.ini24
-rw-r--r--support/bibtexperllibs/Makefile27
-rw-r--r--support/bibtexperllibs/README49
66 files changed, 0 insertions, 5939 deletions
diff --git a/support/bibtexperllibs/BibTeX-Parser/Changes b/support/bibtexperllibs/BibTeX-Parser/Changes
deleted file mode 100644
index da5c2afb8e..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/Changes
+++ /dev/null
@@ -1,86 +0,0 @@
-Revision history for BibTeX::Parser
-
-1.04 2023-08-20 New release
-
-1.03 2022-11-06
- Avoid extra spaces with von part. (Author.pm)
- Add ' to re_namechar. (Parser.pm)
-
-1.02 2018-04-29 03:19:56 +0000
- Corrected the bug when Jr is not accompanied by von.
-
-1.01 2017-11-19 03:12:34 +0000
- New options for to_string:
- - print_pre - whether to print text preceding the entry
- - type_capitalization ('Uppercase', 'Lowercase',
- 'Titlecase')
- - field_capitalization ('Uppercase', 'Lowercase',
- 'Titlecase')
-
-1.00 2017-03-18 21:53:15+00:00
- Typo corrected: editors -> editor
-
-0.70 2016-11-23 02:28:35+00:00
- Compatibility with perl 5.25 (Alexandr Ciornii)
-
-0.69 2016-03-24 15:13:50-04:00
- Added option canonize_names to Entry::to_string
-
-0.68 2016-03-10 13:45:31-05:00
- Now we preserve the order of entries
-
-0.67 2015-12-28 22:36:42+00:00
- Corrected test t/13_output.t
-
-0.66 2015-12-23 19:52:55-05:00
- Corrected bug 67419.
- Added $entry->to_string function
- No Do not remove braces from the authors' names
-
-0.65 2013-09-03 21:04:43
- Add links in documentation.
-
-0.64 2012-03-10 22:23:50
- Remove a warning about undefined value.
-
-0.63 2011-03-15 23:08:18
- Parse files with errors (no keys, spaces in wrong positions). Bug #66325
-
-0.62 2010-10-15 08:52:53
- Declare Test::More minimum version with done_testing
-
-0.61 2010-07-19 16:37:49
- Add methods $entry->cleaned_author / cleaned_editor
-
-0.6 2010-07-19 14:43:15
- Add method $entry->cleaned_field( 'name' )
- Add prerequisite LaTeX::ToUnicode >= 0.02
-
-0.5 2010-07-06 13:17:45 Europe/Berlin
- Do not attempt to clean up returned values
- Author names with braces are split correctly
-
-0.4 2010-02-09
- Parsing of quoted author names (e.g. "{Foo and Bar, Inc.}")
-
-0.3.2 2009-07-26
- Removed dependency on Text::Balanced
-
-0.3.1 2009-07-19
- No changes, removed huge test file from dist
-
-0.3 2009-07-18
- Better parsing of author names,
- new Method B::P::Entry->raw_bibtex
- Removed Module::Install from package
-
-0.21 2009-01-23
- Fixed errors in synopsis.
-
-0.2 2008-12-30
- First public release.
-
-0.1 2008-03-14
- First version, internal
-
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/LICENSE b/support/bibtexperllibs/BibTeX-Parser/LICENSE
deleted file mode 100644
index 1a50e57d4d..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/LICENSE
+++ /dev/null
@@ -1,379 +0,0 @@
-This software is copyright (c) 2013-2022 by Gerhard Gossen and Boris Veytsman and Karl Berry
-
-This is free software; you can redistribute it and/or modify it under
-the same terms as the Perl 5 programming language system itself.
-
-Terms of the Perl programming language system itself
-
-a) the GNU General Public License as published by the Free
- Software Foundation; either version 1, or (at your option) any
- later version, or
-b) the "Artistic License"
-
---- The GNU General Public License, Version 1, February 1989 ---
-
-This software is copyright (c) 2013-2016 by Gerhard Gossen and Boris Veytsman
-
-This is free software, licensed under:
-
- The GNU General Public License, Version 1, February 1989
-
- GNU GENERAL PUBLIC LICENSE
- Version 1, February 1989
-
- Copyright (C) 1989 Free Software Foundation, Inc.
- 51 Franklin St, Suite 500, Boston, MA 02110-1335 USA
-
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The license agreements of most software companies try to keep users
-at the mercy of those companies. By contrast, our General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. The
-General Public License applies to the Free Software Foundation's
-software and to any other program whose authors commit to using it.
-You can use it for your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Specifically, the General Public License is designed to make
-sure that you have the freedom to give away or sell copies of free
-software, 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 make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of a such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must tell them their rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any program or other work which
-contains a notice placed by the copyright holder saying it may be
-distributed under the terms of this General Public License. The
-"Program", below, refers to any such program or work, and a "work based
-on the Program" means either the Program or any work containing the
-Program or a portion of it, either verbatim or with modifications. Each
-licensee is addressed as "you".
-
- 1. You may copy and distribute 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 and
-disclaimer of warranty; keep intact all the notices that refer to this
-General Public License and to the absence of any warranty; and give any
-other recipients of the Program a copy of this General Public License
-along with the Program. You may charge a fee for the physical act of
-transferring a copy.
-
- 2. You may modify your copy or copies of the Program or any portion of
-it, and copy and distribute such modifications under the terms of Paragraph
-1 above, provided that you also do the following:
-
- a) cause the modified files to carry prominent notices stating that
- you changed the files and the date of any change; and
-
- b) cause the whole of any work that you distribute or publish, that
- in whole or in part contains the Program or any part thereof, either
- with or without modifications, to be licensed at no charge to all
- third parties under the terms of this General Public License (except
- that you may choose to grant warranty protection to some or all
- third parties, at your option).
-
- c) If the modified program normally reads commands interactively when
- run, you must cause it, when started running for such interactive use
- in the simplest and most usual way, to print or display an
- announcement including an appropriate copyright notice and a notice
- that there is no warranty (or else, saying that you provide a
- warranty) and that users may redistribute the program under these
- conditions, and telling the user how to view a copy of this General
- Public License.
-
- d) You may charge a fee for the physical act of transferring a
- copy, and you may at your option offer warranty protection in
- exchange for a fee.
-
-Mere aggregation of another independent work with the Program (or its
-derivative) on a volume of a storage or distribution medium does not bring
-the other work under the scope of these terms.
-
- 3. You may copy and distribute the Program (or a portion or derivative of
-it, under Paragraph 2) in object code or executable form under the terms of
-Paragraphs 1 and 2 above provided that you also do one of the following:
-
- a) accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of
- Paragraphs 1 and 2 above; or,
-
- b) accompany it with a written offer, valid for at least three
- years, to give any third party free (except for a nominal charge
- for the cost of distribution) a complete machine-readable copy of the
- corresponding source code, to be distributed under the terms of
- Paragraphs 1 and 2 above; or,
-
- c) accompany it with the information you received as to where the
- corresponding source code may be obtained. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form alone.)
-
-Source code for a work means the preferred form of the work for making
-modifications to it. For an executable file, complete source code means
-all the source code for all modules it contains; but, as a special
-exception, it need not include source code for modules which are standard
-libraries that accompany the operating system on which the executable
-file runs, or for standard header files or definitions files that
-accompany that operating system.
-
- 4. You may not copy, modify, sublicense, distribute or transfer the
-Program except as expressly provided under this General Public License.
-Any attempt otherwise to copy, modify, sublicense, distribute or transfer
-the Program is void, and will automatically terminate your rights to use
-the Program under this License. However, parties who have received
-copies, or rights to use copies, from you under this General Public
-License will not have their licenses terminated so long as such parties
-remain in full compliance.
-
- 5. By copying, distributing or modifying the Program (or any work based
-on the Program) you indicate your acceptance of this license to do so,
-and all its terms and conditions.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the original
-licensor to copy, distribute or modify the Program subject to these
-terms and conditions. You may not impose any further restrictions on the
-recipients' exercise of the rights granted herein.
-
- 7. The Free Software Foundation may publish revised and/or new versions
-of the 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 a version number of the license which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-the license, you may choose any version ever published by the Free Software
-Foundation.
-
- 8. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
-
- 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE 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.
-
- END OF TERMS AND CONDITIONS
-
- Appendix: 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 humanity, 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 convey
-the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) 19yy <name of author>
-
- 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 1, 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, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) 19xx name of author
- Gnomovision 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, the
-commands you use may be called something other than `show w' and `show
-c'; they could even be mouse-clicks or menu items--whatever suits your
-program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- program `Gnomovision' (a program to direct compilers to make passes
- at assemblers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
---- The Artistic License 1.0 ---
-
-This software is Copyright (c) 2013 by Gerhard Gossen.
-
-This is free software, licensed under:
-
- The Artistic License 1.0
-
-The Artistic License
-
-Preamble
-
-The intent of this document is to state the conditions under which a Package
-may be copied, such that the Copyright Holder maintains some semblance of
-artistic control over the development of the package, while giving the users of
-the package the right to use and distribute the Package in a more-or-less
-customary fashion, plus the right to make reasonable modifications.
-
-Definitions:
-
- - "Package" refers to the collection of files distributed by the Copyright
- Holder, and derivatives of that collection of files created through
- textual modification.
- - "Standard Version" refers to such a Package if it has not been modified,
- or has been modified in accordance with the wishes of the Copyright
- Holder.
- - "Copyright Holder" is whoever is named in the copyright or copyrights for
- the package.
- - "You" is you, if you're thinking about copying or distributing this Package.
- - "Reasonable copying fee" is whatever you can justify on the basis of media
- cost, duplication charges, time of people involved, and so on. (You will
- not be required to justify it to the Copyright Holder, but only to the
- computing community at large as a market that must bear the fee.)
- - "Freely Available" means that no fee is charged for the item itself, though
- there may be fees involved in handling the item. It also means that
- recipients of the item may redistribute it under the same conditions they
- received it.
-
-1. You may make and give away verbatim copies of the source form of the
-Standard Version of this Package without restriction, provided that you
-duplicate all of the original copyright notices and associated disclaimers.
-
-2. You may apply bug fixes, portability fixes and other modifications derived
-from the Public Domain or from the Copyright Holder. A Package modified in such
-a way shall still be considered the Standard Version.
-
-3. You may otherwise modify your copy of this Package in any way, provided that
-you insert a prominent notice in each changed file stating how and when you
-changed that file, and provided that you do at least ONE of the following:
-
- a) place your modifications in the Public Domain or otherwise make them
- Freely Available, such as by posting said modifications to Usenet or an
- equivalent medium, or placing the modifications on a major archive site
- such as ftp.uu.net, or by allowing the Copyright Holder to include your
- modifications in the Standard Version of the Package.
-
- b) use the modified Package only within your corporation or organization.
-
- c) rename any non-standard executables so the names do not conflict with
- standard executables, which must also be provided, and provide a separate
- manual page for each non-standard executable that clearly documents how it
- differs from the Standard Version.
-
- d) make other distribution arrangements with the Copyright Holder.
-
-4. You may distribute the programs of this Package in object code or executable
-form, provided that you do at least ONE of the following:
-
- a) distribute a Standard Version of the executables and library files,
- together with instructions (in the manual page or equivalent) on where to
- get the Standard Version.
-
- b) accompany the distribution with the machine-readable source of the Package
- with your modifications.
-
- c) accompany any non-standard executables with their corresponding Standard
- Version executables, giving the non-standard executables non-standard
- names, and clearly documenting the differences in manual pages (or
- equivalent), together with instructions on where to get the Standard
- Version.
-
- d) make other distribution arrangements with the Copyright Holder.
-
-5. You may charge a reasonable copying fee for any distribution of this
-Package. You may charge any fee you choose for support of this Package. You
-may not charge a fee for this Package itself. However, you may distribute this
-Package in aggregate with other (possibly commercial) programs as part of a
-larger (possibly commercial) software distribution provided that you do not
-advertise this Package as a product of your own.
-
-6. The scripts and library files supplied as input to or produced as output
-from the programs of this Package do not automatically fall under the copyright
-of this Package, but belong to whomever generated them, and may be sold
-commercially, and may be aggregated with this Package.
-
-7. C or perl subroutines supplied by you and linked into this Package shall not
-be considered part of this Package.
-
-8. The name of the Copyright Holder may not be used to endorse or promote
-products derived from this software without specific prior written permission.
-
-9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
-MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-
-The End
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/MANIFEST b/support/bibtexperllibs/BibTeX-Parser/MANIFEST
deleted file mode 100644
index 032eea6a15..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/MANIFEST
+++ /dev/null
@@ -1,44 +0,0 @@
-LICENSE
-Changes
-MANIFEST
-t/pod.t
-t/cleaned_field.t
-t/release-pod-coverage.t
-t/bug67419.t
-t/09-complex.t
-t/bug66325.t
-t/07-parse_englishbib.t
-t/13_output.t
-t/01-parse.t
-t/14-extratext.t
-t/05-author.t
-t/08-parse_large.t
-t/release-pod-syntax.t
-t/12-von_token.t
-t/00-load.t
-t/11-split_braced.t
-t/02-parse_string.t
-t/04-entry.t
-t/03-parse_entry.t
-t/bibs/mathscinet.txt
-t/bibs/10-funnyname.bib
-t/bibs/english.bib
-t/bibs/braces.bib
-t/bibs/endnote.txt
-t/bibs/14-extratext.bib
-t/bibs/01.bib
-t/bibs/engineering_village.txt
-t/bibs/09-complex.bib
-t/bibs/06.bib
-t/pod-coverage.t
-t/10-funnyname.t
-t/15-capitalization.t
-t/06-parse_complex.t
-README
-notes
-lib/BibTeX/Parser/Author.pm
-lib/BibTeX/Parser/Entry.pm
-lib/BibTeX/Parser.pm
-Makefile.PL
-Makefile.TDS
-dist.ini
diff --git a/support/bibtexperllibs/BibTeX-Parser/Makefile.PL b/support/bibtexperllibs/BibTeX-Parser/Makefile.PL
deleted file mode 100644
index e095f253b0..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/Makefile.PL
+++ /dev/null
@@ -1,71 +0,0 @@
-
-use strict;
-use warnings;
-
-
-
-use ExtUtils::MakeMaker 6.30;
-
-
-
-my %WriteMakefileArgs = (
- "ABSTRACT" => "A pure perl BibTeX parser",
- "AUTHOR" => 'Gerhard Gossen <gerhard.gossen@googlemail.com> and Boris Veytsman <boris@varphi.com> and Karl Berry <karl@freefriends.org',
- "BUILD_REQUIRES" => {},
- "CONFIGURE_REQUIRES" => {
- "ExtUtils::MakeMaker" => "6.31"
- },
- "DISTNAME" => "BibTeX-Parser",
- "EXE_FILES" => [],
- "LICENSE" => "perl",
- "NAME" => "BibTeX::Parser",
- "PREREQ_PM" => {
- "File::Spec" => 0,
- "IO::File" => 0,
- "IO::String" => 0,
- "LaTeX::ToUnicode" => "0.52",
- "Test::More" => "0.88"
- },
- "TEST_REQUIRES" => {
- "Test::More" => "0.88"
- },
- 'VERSION_FROM' => 'lib/BibTeX/Parser.pm',
- "test" => {
- "TESTS" => "t/*.t"
- }
-);
-
-
-unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
- my $tr = delete $WriteMakefileArgs{TEST_REQUIRES};
- my $br = $WriteMakefileArgs{BUILD_REQUIRES};
- for my $mod ( keys %$tr ) {
- if ( exists $br->{$mod} ) {
- $br->{$mod} = $tr->{$mod} if $tr->{$mod} > $br->{$mod};
- }
- else {
- $br->{$mod} = $tr->{$mod};
- }
- }
-}
-
-unless ( eval { ExtUtils::MakeMaker->VERSION(6.56) } ) {
- my $br = delete $WriteMakefileArgs{BUILD_REQUIRES};
- my $pp = $WriteMakefileArgs{PREREQ_PM};
- for my $mod ( keys %$br ) {
- if ( exists $pp->{$mod} ) {
- $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod};
- }
- else {
- $pp->{$mod} = $br->{$mod};
- }
- }
-}
-
-delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
- unless eval { ExtUtils::MakeMaker->VERSION(6.52) };
-
-WriteMakefile(%WriteMakefileArgs);
-
-
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/Makefile.TDS b/support/bibtexperllibs/BibTeX-Parser/Makefile.TDS
deleted file mode 100644
index 780ebc0af1..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/Makefile.TDS
+++ /dev/null
@@ -1,35 +0,0 @@
-# This is Makefile for TDS-compliant TeX distributions
-# Written by Boris Veytsman, boris@varphi.com
-#
-# This file is in public domain
-#
-PREFIX = /usr/local
-
-LIBDIR = $(PREFIX)/scripts/bibtexperllibs
-
-DOCDIR = $(PREFIX)/doc/bibtex/bibtexperllibs
-
-all:
-
-docs:
-
-install:
- mkdir -p $(LIBDIR)
- cp -r lib/* $(LIBDIR)
- mkdir -p $(DOCDIR)
- cp -r man/man3/* $(DOCDIR)
-
-check test: Makefile
-# need bash pipefail so exit status is from the make, not the tr.
-# the -f Makefile is because of possible GNUmakefile -> Makefile.TDS symlink.
- bash -c "set -o pipefail; \
- env PERL5LIB=../LaTeX-ToUnicode/lib \
- make -f Makefile test | tr '\r' '\n'"
-
-Makefile MYMETA.json MYMeta.yml: Makefile.PL force
- perl Makefile.PL || rm -f $@
-
-clean distclean:
- $(RM) Makefile MYMETA.* blib pm_to_blib *.tar.gz
-
-force:
diff --git a/support/bibtexperllibs/BibTeX-Parser/README b/support/bibtexperllibs/BibTeX-Parser/README
deleted file mode 100644
index cb6f19b576..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/README
+++ /dev/null
@@ -1,9 +0,0 @@
-This is the BibTeX::Parser Perl package:
-
- A pure Perl BibTeX parser
-
-Copyright 2013--2023 Gerhard Gossen, Boris Veytsman, Karl Berry
-
-This is free software; you can redistribute it and/or modify it under
-the same terms as the Perl 5 programming language system itself.
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/dist.ini b/support/bibtexperllibs/BibTeX-Parser/dist.ini
deleted file mode 100644
index bc60ca9352..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/dist.ini
+++ /dev/null
@@ -1,28 +0,0 @@
-name = BibTeX-Parser
-version = 1.04
-author = Gerhard Gossen <gerhard.gossen@googlemail.com> and Boris Veytsman <boris@varphi.com> and Karl Berry <karl@freefriends.org>
-license = Perl_5
-copyright_holder = Gerhard Gossen and Boris Veytsman and Karl Berry
-
-[@Classic]
-
-[NextRelease]
-format = %-7v %{yyyy-MM-dd HH:mm:ss}d
-
-[PodWeaver]
-
-[Prereqs]
-Test::More = 0
-IO::String = 0
-IO::File = 0
-File::Spec = 0
-LaTeX::ToUnicode = 0.11
-
-[Prereqs / TestRequires]
-Test::More = 0.88 ; for done_testing
-
-[PruneFiles]
-filenames = t/bibs/java.bib
-
-[Repository]
-[@Git]
diff --git a/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser.pm b/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser.pm
deleted file mode 100644
index 2897d8495d..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser.pm
+++ /dev/null
@@ -1,366 +0,0 @@
-package BibTeX::Parser;
-{
- $BibTeX::Parser::VERSION = '1.04';
-}
-# ABSTRACT: A pure perl BibTeX parser
-use warnings;
-use strict;
-
-use BibTeX::Parser::Entry;
-
-
-my $re_namechar = qr/[a-zA-Z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|\']/o;
-my $re_name = qr/$re_namechar+/o;
-
-
-sub new {
- my ( $class, $fh ) = @_;
-
- return bless {
- fh => $fh,
- strings => {
- jan => "January",
- feb => "February",
- mar => "March",
- apr => "April",
- may => "May",
- jun => "June",
- jul => "July",
- aug => "August",
- sep => "September",
- oct => "October",
- nov => "November",
- dec => "December",
-
- },
- line => -1,
- buffer => "",
- }, $class;
-}
-
-sub _slurp_close_bracket;
-
-sub _parse_next {
- my $self = shift;
-
- while (1) { # loop until regular entry is finished
- return 0 if $self->{fh}->eof;
- local $_ = $self->{buffer};
-
- until (/@/m) {
- my $line = $self->{fh}->getline;
- return 0 unless defined $line;
- $line =~ s/^%.*$//;
- $_ .= $line;
- }
-
- my $current_entry = new BibTeX::Parser::Entry;
- if (/@($re_name)/cgo) {
- my $type = uc $1;
- $current_entry->type( $type );
- my $start_pos = pos($_) - length($type) - 1;
-
- # read rest of entry (matches braces)
- my $bracelevel = 0;
- $bracelevel += tr/\{/\{/; #count braces
- $bracelevel -= tr/\}/\}/;
- while ( $bracelevel != 0 ) {
- my $position = pos($_);
- my $line = $self->{fh}->getline;
- last unless defined $line;
- $bracelevel =
- $bracelevel + ( $line =~ tr/\{/\{/ ) - ( $line =~ tr/\}/\}/ );
- $_ .= $line;
- pos($_) = $position;
- }
-
- # Remember text before the entry
- my $pre = substr($_, 0, $start_pos-1);
- if ($start_pos == 0) {
- $pre = '';
- }
- $current_entry->pre($pre);
-
-
- # Remember raw bibtex code
- my $raw = substr($_, $start_pos);
- $raw =~ s/^\s+//;
- $raw =~ s/\s+$//;
- $current_entry->raw_bibtex($raw);
-
- my $pos = pos $_;
- tr/\n/ /;
- pos($_) = $pos;
-
- if ( $type eq "STRING" ) {
- if (/\G\{\s*($re_name)\s*=\s*/cgo) {
- my $key = $1;
- my $value = _parse_string( $self->{strings} );
- if ( defined $self->{strings}->{$key} ) {
- warn("Redefining string $key!");
- }
- $self->{strings}->{$key} = $value;
- /\G[\s\n]*\}/cg;
- } else {
- $current_entry->error("Malformed string!");
- return $current_entry;
- }
- } elsif ( $type eq "COMMENT" or $type eq "PREAMBLE" ) {
- /\G\{./cgo;
- _slurp_close_bracket;
- } else { # normal entry
- $current_entry->parse_ok(1);
-
- # parse key
- if (/\G\s*\{(?:\s*($re_name)\s*,[\s\n]*|\s+\r?\s*)/cgo) {
- $current_entry->key($1);
-
- # fields
- while (/\G[\s\n]*($re_name)[\s\n]*=[\s\n]*/cgo) {
- $current_entry->field(
- $1 => _parse_string( $self->{strings} ) );
- my $idx = index( $_, ',', pos($_) );
- pos($_) = $idx + 1 if $idx > 0;
- }
-
- return $current_entry;
-
- } else {
-
- $current_entry->error("Malformed entry (key contains illegal characters) at " . substr($_, pos($_) || 0, 20) . ", ignoring");
- _slurp_close_bracket;
- return $current_entry;
- }
- }
-
- $self->{buffer} = substr $_, pos($_);
-
- } else {
- $current_entry->error("Did not find type at " . substr($_, pos($_) || 0, 20));
- return $current_entry;
- }
-
- }
-}
-
-
-sub next {
- my $self = shift;
-
- return $self->_parse_next;
-}
-
-# slurp everything till the next closing brace. Handles
-# nested brackets
-sub _slurp_close_bracket {
- my $bracelevel = 0;
- BRACE: {
- /\G[^\}]*\{/cg && do { $bracelevel++; redo BRACE };
- /\G[^\{]*\}/cg
- && do {
- if ( $bracelevel > 0 ) {
- $bracelevel--;
- redo BRACE;
- } else {
- return;
- }
- }
- }
-}
-
-# parse bibtex string in $_ and return. A BibTeX string is either enclosed
-# in double quotes '"' or matching braces '{}'. The braced form may contain
-# nested braces.
-sub _parse_string {
- my $strings_ref = shift;
-
- my $value = "";
-
- PART: {
- if (/\G(\d+)/cg) {
- $value .= $1;
- } elsif (/\G($re_name)/cgo) {
- warn("Using undefined string $1") unless defined $strings_ref->{$1};
- $value .= $strings_ref->{$1} || "";
- } elsif (/\G"(([^"\\]*(\\.)*[^\\"]*)*)"/cgs)
- { # quoted string with embeded escapes
- $value .= $1;
- } else {
- my $part = _extract_bracketed( $_ );
- $value .= substr $part, 1, length($part) - 2; # strip quotes
- }
-
- if (/\G\s*#\s*/cg) { # string concatenation by #
- redo PART;
- }
- }
- $value =~ s/[\s\n]+/ /g;
- return $value;
-}
-
-sub _extract_bracketed
-{
- for($_[0]) # alias to $_
- {
- /\G\s+/cg;
- my $start = pos($_);
- my $depth = 0;
- while(1)
- {
- /\G\\./cg && next;
- /\G\{/cg && (++$depth, next);
- /\G\}/cg && (--$depth > 0 ? next : last);
- /\G([^\\\{\}]+)/cg && next;
- last; # end of string
- }
- return substr($_, $start, pos($_)-$start);
- }
-}
-
-# Split the $string using $pattern as a delimiter with
-# each part having balanced braces (so "{$pattern}"
-# does NOT split).
-# Return empty list if unmatched braces
-
-sub _split_braced_string {
- my $string = shift;
- my $pattern = shift;
- my @tokens;
- return () if $string eq '';
- my $buffer;
- while (!defined pos $string || pos $string < length $string) {
- if ( $string =~ /\G(.*?)(\{|$pattern)/cgi ) {
- my $match = $1;
- if ( $2 =~ /$pattern/i ) {
- $buffer .= $match;
- push @tokens, $buffer;
- $buffer = "";
- } elsif ( $2 =~ /\{/ ) {
- $buffer .= $match . "{";
- my $numbraces=1;
- while ($numbraces !=0 && pos $string < length $string) {
- my $symbol = substr($string, pos $string, 1);
- $buffer .= $symbol;
- if ($symbol eq '{') {
- $numbraces ++;
- } elsif ($symbol eq '}') {
- $numbraces --;
- }
- pos($string) ++;
- }
- if ($numbraces != 0) {
- return ();
- }
- } else {
- $buffer .= $match;
- }
- } else {
- $buffer .= substr $string, (pos $string || 0);
- last;
- }
- }
- push @tokens, $buffer if $buffer;
- return @tokens;
-}
-
-
-1; # End of BibTeX::Parser
-
-
-__END__
-=pod
-
-=head1 NAME
-
-BibTeX::Parser - A pure perl BibTeX parser
-
-
-=head1 SYNOPSIS
-
-Parses BibTeX files.
-
- use BibTeX::Parser;
- use IO::File;
-
- my $fh = IO::File->new("filename");
-
- # Create parser object ...
- my $parser = BibTeX::Parser->new($fh);
-
- # ... and iterate over entries
- while (my $entry = $parser->next ) {
- if ($entry->parse_ok) {
- my $type = $entry->type;
- my $title = $entry->field("title");
-
- my @authors = $entry->author;
- # or:
- my @editors = $entry->editor;
-
- foreach my $author (@authors) {
- print $author->first . " "
- . $author->von . " "
- . $author->last . ", "
- . $author->jr;
- }
- } else {
- warn "Error parsing file: " . $entry->error;
- }
- }
-
-
-
-=head1 FUNCTIONS
-
-=head2 new
-
-Creates new parser object.
-
-Parameters:
-
- * fh: A filehandle
-
-=head2 next
-
-Returns the next parsed entry or undef.
-
-=head1 NOTES
-
-The fields C<author> and C<editor> are canonized, see
-L<BibTeX::Parser::Author>
-
-
-=head1 SEE ALSO
-
-=over 4
-
-=item
-
-L<BibTeX::Parser::Entry>
-
-=item
-
-L<BibTeX::Parser::Author>
-
-=back
-
-=head1 VERSION
-
-version 1.04
-
-
-=head1 AUTHOR
-
-Gerhard Gossen <gerhard.gossen@googlemail.com> and
-Boris Veytsman <boris@varphi.com> and
-Karl Berry <karl@freefriends.org>
-
-=head1 COPYRIGHT AND LICENSE
-
-This software is copyright (c) 2013-2023 by Gerhard Gossen and Boris Veytsman and Karl Berry.
-
-This is free software; you can redistribute it and/or modify it under
-the same terms as the Perl 5 programming language system itself.
-
-=cut
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Author.pm b/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Author.pm
deleted file mode 100644
index a35e2073a6..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Author.pm
+++ /dev/null
@@ -1,429 +0,0 @@
-package BibTeX::Parser::Author;
-{
- $BibTeX::Parser::Author::VERSION = '1.04';
-}
-
-use warnings;
-use strict;
-
-use BibTeX::Parser;
-
-
-use overload
- '""' => \&to_string;
-
-
-
-sub new {
- my $class = shift;
-
- if (@_) {
- my $self = [ $class->split(@_) ];
- return bless $self, $class;
- } else {
- return bless [], $class;
- }
-}
-
-sub _get_or_set_field {
- my ($self, $field, $value) = @_;
- if (defined $value) {
- $self->[$field] = $value;
- } else {
- return $self->[$field];
- }
-}
-
-
-sub first {
- shift->_get_or_set_field(0, @_);
-}
-
-
-sub von {
- shift->_get_or_set_field(1, @_);
-}
-
-
-sub last {
- shift->_get_or_set_field(2, @_);
-}
-
-
-sub jr {
- shift->_get_or_set_field(3, @_);
-}
-
-
-# Take a string and create an array [first, von, last, jr]
-sub split {
- my ($self_or_class, $name) = @_;
-
- # remove whitespace at start and end of string
- $name =~ s/^\s*(.*)\s*$/$1/s;
-
-
-
- if (!length($name)) {
- return (undef, undef, undef, undef);
- }
-
- my @comma_separated =
- BibTeX::Parser::_split_braced_string($name,
- '\s*,\s*');
- if (scalar(@comma_separated) == 0) {
- # Error?
- return (undef, undef, undef, undef);
- }
-
- my $first=undef;
- my $von=undef;
- my $last=undef;
- my $jr=undef;
-
- if (scalar(@comma_separated) == 1) {
- # First von Last form
- my @tokens =
- BibTeX::Parser::_split_braced_string($name, '\s+');
- if (!scalar (@tokens)) {
- return (undef, undef, undef, undef);
- }
- my ($start_von, $start_last) = _getStartVonLast (@tokens);
- if ($start_von >0) {
- $first = join(' ', splice(@tokens,0,$start_von));
- }
- if (($start_last-$start_von) >0) {
- $von = join(' ', splice(@tokens,0,$start_last-$start_von));
- }
- $last = join(' ',@tokens);
- return ($first, $von, $last, $jr);
- }
- # Now we work with von Last, [Jr,] First form
- if (scalar @comma_separated == 2) { # no jr
- my @tokens=
- BibTeX::Parser::_split_braced_string($comma_separated[1], '\s+');
- $first = join(' ', @tokens);
- } else { # jr is present
- my @tokens=
- BibTeX::Parser::_split_braced_string($comma_separated[1], '\s+');
- $jr = join(' ', @tokens);
- @tokens=
- BibTeX::Parser::_split_braced_string($comma_separated[2], '\s+');
- $first = join(' ', @tokens);
- }
- my @tokens =
- BibTeX::Parser::_split_braced_string($comma_separated[0], '\s+');
- my $start_last = _getStartLast(@tokens);
- if ($start_last > 0) {
- $von=join(' ', splice(@tokens,0,$start_last));
- }
- $last = join(' ',@tokens);
- return ($first, $von, $last, $jr);
-
-}
-
-# Return the index of the first von element and the first lastname
-# element. If no von element, von=last
-
-sub _getStartVonLast {
- my $length=scalar(@_);
- if ($length==1) {
- return (0,0);
- }
- my $start_von=-1;
- my $start_last=$length-1;
- for (my $i=0; $i<$length; $i++) {
- if (_is_von_token($_[$i])) {
- $start_von=$i;
- last;
- }
- }
- if ($start_von== -1) { # no von part
- return($length-1, $length-1);
- }
- if ($start_von== $length-1) { # all parts but last are upper case?
- return($length-1, $length-1);
- }
- for (my $i=$start_von+1; $i<$length; $i++) {
- if (!_is_von_token($_[$i])) {
- $start_last=$i;
- last;
- }
- }
- return($start_von, $start_last);
-}
-
-
-# Return the index of the first lastname
-# element provided no first name elements are present
-
-sub _getStartLast {
- my $length=scalar(@_);
- if ($length==1) {
- return 0;
- }
- my $start_last=$length-1;
- for (my $i=0; $i<$length; $i++) {
- if (!_is_von_token($_[$i])) {
- $start_last=$i;
- last;
- }
- }
- return $start_last;
-}
-
-
-sub _split_name_parts {
- my $name = shift;
-
- if ( $name !~ /\{/ ) {
- return split /\s+/, $name;
- } else {
- my @parts;
- my $cur_token = '';
- while ( scalar( $name =~ /\G ( [^\s\{]* ) ( \s+ | \{ | \s* $ ) /xgc ) ) {
- $cur_token .= $1;
- if ( $2 =~ /\{/ ) {
- if ( scalar( $name =~ /\G([^\}]*)\}/gc ) ) {
- $cur_token .= "{$1}";
- } else {
- die "Unmatched brace in name '$name'";
- }
- } else {
- if ( $cur_token =~ /^{(.*)}$/ ) {
- $cur_token = $1;
- }
- push @parts, $cur_token;
- $cur_token = '';
- }
- }
- return @parts;
- }
-
-}
-
-
-sub _get_single_author_from_tokens {
- my (@tokens) = @_;
- if (@tokens == 0) {
- return (undef, undef, undef, undef);
- } elsif (@tokens == 1) { # name without comma
- if ( $tokens[0] =~ /(^|\s)[[:lower:]]/) { # name has von part or has only lowercase names
- my @name_parts = _split_name_parts $tokens[0];
-
- my $first;
- while (@name_parts && ucfirst($name_parts[0]) eq $name_parts[0] ) {
- $first .= $first ? ' ' . shift @name_parts : shift @name_parts;
- }
-
- my $von;
- # von part are lowercase words
- while ( @name_parts && lc($name_parts[0]) eq $name_parts[0] ) {
- $von .= $von ? ' ' . shift @name_parts : shift @name_parts;
- }
-
- if (@name_parts) {
- return ($first, $von, join(" ", @name_parts), undef);
- } else {
- return (undef, undef, $tokens[0], undef);
- }
- } else {
- if ( $tokens[0] !~ /\{/ && $tokens[0] =~ /^((.*)\s+)?\b(\S+)$/) {
- return ($2, undef, $3, undef);
- } else {
- my @name_parts = _split_name_parts $tokens[0];
- return ($name_parts[0], undef, $name_parts[1], undef);
- }
- }
-
- } elsif (@tokens == 2) {
- my @von_last_parts = _split_name_parts $tokens[0];
- my $von;
- # von part are lowercase words
- while ( @von_last_parts && lc($von_last_parts[0]) eq $von_last_parts[0] ) {
- $von .= $von ? ' ' . shift @von_last_parts : shift @von_last_parts;
- }
- return ($tokens[1], $von, join(" ", @von_last_parts), undef);
- } else {
- my @von_last_parts = _split_name_parts $tokens[0];
- my $von;
- # von part are lowercase words
- while ( @von_last_parts && lc($von_last_parts[0]) eq $von_last_parts[0] ) {
- $von .= $von ? ' ' . shift @von_last_parts : shift @von_last_parts;
- }
- return ($tokens[2], $von, join(" ", @von_last_parts), $tokens[1]);
- }
-
-}
-
-
-
-# The goal is to return a name in form
-# von Last, Jr, First
-# where any of the parts except Last may be empty.
-#
-sub to_string {
- my $self = shift;
-
- my $last = $self->last; # assume always present
- my $first = $self->first ? (", " . $self->first) : ''; # ", first"
- my $von = $self->von ? ($self->von . " ") : ''; # "von "
- my $jr = $self->jr ? (", " . $self->jr ) : ''; # ", jr"
- #
- my $ret = "${von}${last}${jr}${first}";
- #warn "returning name: $ret\n";
- return $ret;
-
-# original code, which introduced a spurious space with a von part.
-# https://github.com/borisveytsman/crossrefware/issues/11
-#
-# if ($self->jr) {
-# return () . " " . $self->last . ", " . $self->jr . ", " . $self->first;
-# } else {
-# return ($self->von ? $self->von . " " : '') . $self->last . ($self->first ? ", " . $self->first : '');
-# }
-#
-}
-
-
-# Return 1 if the first letter on brace level 0 is lowercase
-sub _is_von_token {
- my $string = shift;
- while ($string =~
- s/^(\\[[:alpha:]]+\{|\{|\\[[:^alpha:]]?|[[:^alpha:]])//) {
- if ($1 eq '{' ) {
- my $numbraces=1;
- while ($numbraces !=0 && length($string)) {
- my $symbol = substr($string, 0, 1);
- if ($symbol eq '{') {
- $numbraces ++;
- } elsif ($symbol eq '}') {
- $numbraces --;
- }
- $string = substr($string,1);
- }
- }
- }
-
- if (length $string ) {
- my $symbol = substr($string, 0, 1);
- if (lc($symbol) eq $symbol) {
- return 1;
- } else {
- return 0;
- }
- } else {
- return 1;
- }
-
-}
-
-1; # End of BibTeX::Entry
-
-__END__
-=pod
-
-=head1 NAME
-
-BibTeX::Author - Contains a single author for a BibTeX document.
-
-=head1 SYNOPSIS
-
-This class ist a wrapper for a single BibTeX author. It is usually created
-by a BibTeX::Parser.
-
- use BibTeX::Parser::Author;
-
- my $entry = BibTeX::Parser::Author->new($full_name);
-
- my $firstname = $author->first;
- my $von = $author->von;
- my $last = $author->last;
- my $jr = $author->jr;
-
- # or ...
-
- my ($first, $von, $last, $jr) = BibTeX::Author->split($fullname);
-
-
-
-=head1 FUNCTIONS
-
-=head2 new
-
-Create new author object. Expects full name as parameter.
-
-=head2 first
-
-Set or get first name(s).
-
-=head2 von
-
-Set or get 'von' part of name.
-
-=head2 last
-
-Set or get last name(s).
-
-=head2 jr
-
-Set or get 'jr' part of name.
-
-=head2 split
-
-Split name into (firstname, von part, last name, jr part). Returns array
-with four strings, some of them possibly empty.
-
-=head2 to_string
-
-Return string representation of the name.
-
-=head1 NOTES
-
-BibTeX allows three representations of a person's name:
-
-=over 4
-
-=item 1.
-
-First von Last
-
-=item 2.
-
-von Last, First
-
-=item 3.
-
-von Last, Jr, First
-
-=back
-
-The module always converts the first form to the second of third one
-to allow simple string comparisons.
-
-The algorithm to determine the von part is the following: von part
-consists of tokens where the first letter at brace level 0 is in lower case.
-Anything in a "special characters" is on brace level 0. Thus the following
-tokens are considered von parts: C<von>, C<\NOOP{von}Von>, and
-the following token is not: C<{von}>
-
-=head1 VERSION
-
-version 1.04
-
-
-=head1 AUTHOR
-
-Gerhard Gossen <gerhard.gossen@googlemail.com> and
-Boris Veytsman <boris@varphi.com> and
-Karl Berry <karl@freefriends.org>
-
-=head1 COPYRIGHT AND LICENSE
-
-This software is copyright (c) 2013--2023 by Gerhard Gossen and Boris Veytsman and Karl Berry.
-
-This is free software; you can redistribute it and/or modify it under
-the same terms as the Perl 5 programming language system itself.
-
-=cut
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Entry.pm b/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Entry.pm
deleted file mode 100644
index d0bc9cc80b..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Entry.pm
+++ /dev/null
@@ -1,435 +0,0 @@
-package BibTeX::Parser::Entry;
-{
- $BibTeX::Parser::Entry::VERSION = '1.04';
-}
-
-use warnings;
-use strict;
-
-use BibTeX::Parser;
-use BibTeX::Parser::Author;
-
-
-
-sub new {
- my ($class, $type, $key, $parse_ok, $fieldsref) = @_;
-
- my %fields = defined $fieldsref ? %$fieldsref : ();
- my $i=0;
- foreach my $field (keys %fields) {
- if ($field !~ /^_/) {
- $fields{_fieldnums}->{$field}=$i;
- $i++;
- }
- }
- if (defined $type) {
- $fields{_type} = uc($type);
- }
- $fields{_key} = $key;
- $fields{_parse_ok} = $parse_ok;
- $fields{_raw} = '';
- return bless \%fields, $class;
-}
-
-
-
-sub parse_ok {
- my $self = shift;
- if (@_) {
- $self->{_parse_ok} = shift;
- }
- $self->{_parse_ok};
-}
-
-
-sub error {
- my $self = shift;
- if (@_) {
- $self->{_error} = shift;
- $self->parse_ok(0);
- }
- return $self->parse_ok ? undef : $self->{_error};
-}
-
-
-sub type {
- if (scalar @_ == 1) {
- # get
- my $self = shift;
- return $self->{_type};
- } else {
- # set
- my ($self, $newval) = @_;
- $self->{_type} = uc($newval);
- }
-}
-
-
-sub key {
- if (scalar @_ == 1) {
- # get
- my $self = shift;
- return $self->{_key};
- } else {
- # set
- my ($self, $newval) = @_;
- $self->{_key} = $newval;
- }
-
-}
-
-
-sub field {
- if (scalar @_ == 2) {
- # get
- my ($self, $field) = @_;
- return $self->{ lc( $field ) };
- } else {
- my ($self, $key, $value) = @_;
- my $field = lc ($key);
- $self->{$field} = $value; #_sanitize_field($value);
- if (!exists($self->{_fieldnums}->{$field})) {
- my $num = scalar keys %{$self->{_fieldnums}};
- $self->{_fieldnums}->{$field} = $num;
- }
- }
-
-}
-
-use LaTeX::ToUnicode qw( convert );
-
-
-sub cleaned_field {
- my ( $self, $field, @options ) = @_;
- if ( $field =~ /author|editor/i ) {
- return $self->field( $field );
- } else {
- return convert( $self->field( lc $field ), @options );
- }
-}
-
-
-sub cleaned_author {
- my $self = shift;
- $self->_handle_cleaned_author_editor( [ $self->author ], @_ );
-}
-
-
-sub cleaned_editor {
- my $self = shift;
- $self->_handle_cleaned_author_editor( [ $self->editor ], @_ );
-}
-
-sub _handle_cleaned_author_editor {
- my ( $self, $authors, @options ) = @_;
- map {
- my $author = $_;
- my $new_author = BibTeX::Parser::Author->new;
- map {
- $new_author->$_( convert( $author->$_, @options ) )
- } grep { defined $author->$_ } qw( first von last jr );
- $new_author;
- } @$authors;
-}
-
-no LaTeX::ToUnicode;
-
-sub _handle_author_editor {
- my $type = shift;
- my $self = shift;
- if (@_) {
- if (@_ == 1) { #single string
- # my @names = split /\s+and\s+/i, $_[0];
- $_[0] =~ s/^\s*//;
- $_[0] =~ s/\s*$//;
- my @names = BibTeX::Parser::_split_braced_string($_[0],
- '\s+and\s+');
- if (!scalar @names) {
- $self->error('Bad names in author/editor field');
- return;
- }
- $self->{"_$type"} = [map {new BibTeX::Parser::Author $_} @names];
- $self->field($type, join " and ", @{$self->{"_$type"}});
- } else {
- $self->{"_$type"} = [];
- foreach my $param (@_) {
- if (ref $param eq "BibTeX::Author") {
- push @{$self->{"_$type"}}, $param;
- } else {
- push @{$self->{"_$type"}}, new BibTeX::Parser::Author $param;
- }
-
- $self->field($type, join " and ", @{$self->{"_$type"}});
- }
- }
- } else {
- unless ( defined $self->{"_$type"}) {
- my @names = BibTeX::Parser::_split_braced_string($self->{$type} || "", '\s+and\s+' );
- $self->{"_$type"} = [map {new BibTeX::Parser::Author $_} @names];
- }
- return @{$self->{"_$type"}};
- }
-}
-
-
-
-sub author {
- _handle_author_editor('author', @_);
-}
-
-
-sub editor {
- _handle_author_editor('editor', @_);
-}
-
-
-sub fieldlist {
- my $self = shift;
-
- return grep {!/^_/} keys %$self;
-}
-
-
-sub has {
- my ($self, $field) = @_;
-
- return defined $self->{$field};
-}
-
-sub _sanitize_field {
- my $value = shift;
- for ($value) {
- tr/\{\}//d;
- s/\\(?!=[ \\])//g;
- s/\\\\/\\/g;
- }
- return $value;
-}
-
-
-
-sub raw_bibtex {
- my $self = shift;
- if (@_) {
- $self->{_raw} = shift;
- }
- return $self->{_raw};
-}
-
-sub pre {
- my $self = shift;
- if (@_) {
- $self->{_pre} = shift;
- }
- return $self->{_pre};
-}
-
-
-sub to_string {
- my $self = shift;
- my %options=@_;
- if (!exists($options{canonize_names})) {
- $options{canonize_names}=1;
- }
- my @fields = grep {!/^_/} keys %$self;
- @fields = sort {
- $self->{_fieldnums}->{$a} <=>
- $self->{_fieldnums}->{$b}} @fields;
- my $result = '';
- if ($options{print_pre}) {
- $result .= $self->pre()."\n";
- }
- my $type = $self->type;
- if (exists($options{type_capitalization})) {
- if ($options{type_capitalization} eq 'Lowercase') {
- $type = lc $type;
- }
- if ($options{type_capitalization} eq 'Titlecase') {
- $type = ucfirst lc $type;
- }
- }
- print STDERR $self->key, "\n";
- $result .= '@'.$type."{".$self->key.",\n";
- foreach my $field (@fields) {
- my $value = $self->field($field);
- if ($field eq 'author' && $options{canonize_names}) {
- my @names = ($self->author);
- $value = join(' and ', @names);
- }
- if ($field eq 'editor' && $options{canonize_names}) {
- my @names = ($self->editor);
- $value = join(' and ', @names);
- }
- if (exists($options{field_capitalization})) {
- if ($options{field_capitalization} eq 'Uppercase') {
- $field = uc $field;
- }
- if ($options{field_capitalization} eq 'Titlecase') {
- $field = ucfirst $field;
- }
- }
- $result .= " $field = {"."$value"."},\n";
- }
- $result .= "}";
- return $result;
-}
-
-1; # End of BibTeX::Entry
-
-__END__
-=pod
-
-=head1 NAME
-
-BibTeX::Parser::Entry - Contains a single entry of a BibTeX document.
-
-=head1 SYNOPSIS
-
-This class ist a wrapper for a single BibTeX entry. It is usually created
-by a BibTeX::Parser.
-
- use BibTeX::Parser::Entry;
-
- my $entry = BibTeX::Parser::Entry->new($type, $key, $parse_ok, \%fields);
-
- if ($entry->parse_ok) {
- my $type = $entry->type;
- my $key = $enty->key;
- print $entry->field("title");
- my @authors = $entry->author;
- my @editors = $entry->editor;
-
- ...
-
- print $entry->to_string;
- }
-
-
-
-
-
-=head1 FUNCTIONS
-
-=head2 new
-
-Create new entry.
-
-=head2 parse_ok
-
-If the entry was correctly parsed, this method returns a true value, false otherwise.
-
-=head2 error
-
-Return the error message, if the entry could not be parsed or undef otherwise.
-
-=head2 type
-
-Get or set the type of the entry, eg. 'ARTICLE' or 'BOOK'. Return value is
-always uppercase.
-
-=head2 key
-
-Get or set the reference key of the entry.
-
-=head2 field($name [, $value])
-
-Get or set the contents of a field. The first parameter is the name of the
-field, the second (optional) value is the new value.
-
-=head2 cleaned_field($name)
-
-Retrieve the contents of a field in a format that is cleaned of TeX markup.
-
-=head2 cleaned_author
-
-Get an array of L<BibTeX::Parser::Author> objects for the authors of this
-entry. Each name has been cleaned of accents and braces.
-
-=head2 cleaned_editor
-
-Get an array of L<BibTeX::Parser::Author> objects for the editors of this
-entry. Each name has been cleaned of accents and braces.
-
-=head2 author([@authors])
-
-Get or set the authors. Returns an array of L<BibTeX::Author|BibTeX::Author>
-objects. The parameters can either be L<BibTeX::Author|BibTeX::Author> objects
-or strings.
-
-Note: You can also change the authors with $entry->field('author', $authors_string)
-
-=head2 editor([@editors])
-
-Get or set the editors. Returns an array of L<BibTeX::Author|BibTeX::Author>
-objects. The parameters can either be L<BibTeX::Author|BibTeX::Author> objects
-or strings.
-
-Note: You can also change the authors with $entry->field('editor', $editors_string)
-
-=head2 fieldlist ()
-
-Returns a list of all the fields used in this entry.
-
-=head2 has($fieldname)
-
-Returns a true value if this entry has a value for $fieldname.
-
-=head2 pre ()
-
-Return the text in BibTeX file before the entry
-
-=head2 raw_bibtex ()
-
-Return raw BibTeX entry (if available).
-
-=head2 to_string ([options])
-
-Returns a text of the BibTeX entry in BibTeX format. Options are
-a hash.
-
-=over 4
-
-=item C<canonize_names>
-
-If true (the default), authors' and editors'
-names are translated into canonical bibtex form. The command
-C<$entry-E<gt>to_string(canonize_names=E<gt>0)> overrides this behavior.
-
-=item C<field_capitalization>
-
-Capitalization of the field names.
-Can take values 'Uppercase', 'Lowercase' (the default) or 'Titlecase'
-
-=item C<print_pre>
-
-False by default. If true, the text in the Bib file before the
-entry is printed. Note that at present we assume the text
-before the entry NEVER has the @ symbol inside
-
-=item C<type_capitalization>
-
-Capitalization of the type names.
-Can take values 'Uppercase' (the default), 'Lowercase' or 'Titlecase'
-
-
-=back
-
-=head1 VERSION
-
-version 1.04
-
-=head1 AUTHOR
-
-Gerhard Gossen <gerhard.gossen@googlemail.com> and
-Boris Veytsman <boris@varphi.com> and
-Karl Berry <karl@freefriends.org>
-
-=head1 COPYRIGHT AND LICENSE
-
-This software is copyright (c) 2013-2023 by Gerhard Gossen and Boris Veytsman and Karl Berry
-
-This is free software; you can redistribute it and/or modify it under
-the same terms as the Perl 5 programming language system itself.
-
-=cut
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/notes b/support/bibtexperllibs/BibTeX-Parser/notes
deleted file mode 100644
index 5e41df4090..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/notes
+++ /dev/null
@@ -1,26 +0,0 @@
-from Biblio::Catalog::BibTeX :
-
-sub tex2html {
- my $latex = shift;
- return "" unless defined($latex);
-
- for ($latex) {
- s/\\textit\{([^{]+)\}/<i>$1<\/i>/g;
- s/\\textbf\{([^{]+)\}/<b>$1<\/b>/g;
- s/\\texttt\{([^{]+)\}/<tt>$1<\/tt>/g;
- s/\\emph{([^{]+)}/<i>$1<\/i>/g;
- s/\\item\b/<li>/g;
- s/\\_/_/g;
- s/\\mbox{([^}]+)}/$1/g;
- s/{\\it\s([^}]+)}/<i>$1<\/i>/g;
- s/\\LaTeX/LaTeX/g;
- s/\\begin{itemize}/<ul>/g;
- s/\\begin{quote}/<blockquote><i>/g;
- s/\\end{quote}/<\/i><\/blockquote>/g;
- s/\\end{itemize}/<\/ul>/g;
- s/[}{]//g;
- }
-
- return $latex;
-}
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/00-load.t b/support/bibtexperllibs/BibTeX-Parser/t/00-load.t
deleted file mode 100644
index 9862dc7986..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/00-load.t
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More tests => 3;
-
-BEGIN {
- use_ok( 'BibTeX::Parser' );
- use_ok( 'BibTeX::Parser::Author' );
- use_ok( 'BibTeX::Parser::Entry' );
-}
-
-diag( "Testing BibTeX::Parser $BibTeX::Parser::VERSION, Perl $], $^X" );
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/01-parse.t b/support/bibtexperllibs/BibTeX-Parser/t/01-parse.t
deleted file mode 100644
index 70e298d4be..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/01-parse.t
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More tests => 11;
-
-use BibTeX::Parser;
-use IO::File;
-
-use constant ENTRIES => 1;
-
-my $fh = new IO::File "t/bibs/01.bib", "r" ;
-
-if (defined $fh) {
- my $parser = new BibTeX::Parser $fh;
-
- isa_ok($parser, "BibTeX::Parser");
-
- my $count = 0;
-
- while (my $entry = $parser->next) {
- $count++;
- isa_ok($entry, "BibTeX::Parser::Entry");
- is($entry->key, "key01", "key");
- is($entry->type, "ARTICLE", "type");
- ok($entry->parse_ok, "parse_ok");
- is($entry->field("year"), 1950, "field");
- is($entry->field("month"), "January~1", "field");
-
- my @authors = $entry->author;
- is(scalar @authors, 2, "#authors");
- isa_ok($authors[0], "BibTeX::Parser::Author");
- is("$authors[0]", "Duck, Donald", "correct author");
- }
-
- is($count, ENTRIES, "number of entries");
-}
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/02-parse_string.t b/support/bibtexperllibs/BibTeX-Parser/t/02-parse_string.t
deleted file mode 100644
index 90b87eba14..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/02-parse_string.t
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More tests => 7;
-
-use BibTeX::Parser;
-
-my %strings = ();
-
-$_ = 1234;
-parse_ok("parse digit string");
-
-$_ = '"simple double quoted string"';
-parse_is("simple double quoted string", "- double quoted string");
-
-$_ = '"double quotes { with embeded } brackets"';
-parse_is("double quotes { with embeded } brackets", "- with embeded brackets");
-
-$_ = '"string 1 " # "string 2"';
-parse_is("string 1 string 2", "- concatenation");
-
-$strings{test} = "string";
-$strings{other} = "text";
-
-$_ = "test";
-parse_is("string", "- string variable");
-
-$_ = "test # other";
-parse_is("stringtext", "- concatenation of string variables");
-
-$_ = '"M{\"{u}}nchen"';
-parse_is('M{\"{u}}nchen', "- escaped quote");
-
-sub parse_ok {
- is(BibTeX::Parser::_parse_string(\%strings), $_, shift);
-}
-
-sub parse_is {
- is(BibTeX::Parser::_parse_string(\%strings), shift, shift);
-}
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/03-parse_entry.t b/support/bibtexperllibs/BibTeX-Parser/t/03-parse_entry.t
deleted file mode 100644
index 6b4e4632bc..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/03-parse_entry.t
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More tests => 3;
-
-use IO::String;
-use BibTeX::Parser;
-
-{
- my $string = q|@article{lin1973,
- author = "Shen Lin and Brian W. Kernighan",
- title = "An Effective Heuristic Algorithm for the Travelling-Salesman Problem",
- journal = "Operations Research",
- volume = 21,
- year = 1973,
- pages = "498--516"
- }|;
- my $fh = IO::String->new($string);
-
- my $parser = BibTeX::Parser->new( $fh );
-
-#my @result = BibTeX::Parser->_parse($fh);
-
- my $entry = $parser->next;
-
- is_deeply($entry, {_type => 'ARTICLE', _key => 'lin1973', author => "Shen Lin and Brian W. Kernighan",
- title => "An Effective Heuristic Algorithm for the Travelling-Salesman Problem",
- journal => "Operations Research",
- volume => 21,
- year => 1973,
- pages => "498--516", _parse_ok => 1,
- _fieldnums => {'author' => 0, 'title' => 1,
- 'journal' => 2, 'volume' => 3,
- 'year' => 4, 'pages' => 5},
- _pre => '',
- _raw => $string}, "parse \@ARTICLE");
-
-}
-{
- my $string1 = q|@article{lin1973,
- author = "Shen Lin and Brian W. Kernighan",
- title = "An Effective Heuristic Algorithm for the Travelling-Salesman Problem",
- journal = "Operations Research",
- volume = 21,
- year = 1973,
- pages = "498--516"
- }|;
- my $string = "some
-text
-$string1";
- my $fh = IO::String->new($string);
-
- my $parser = BibTeX::Parser->new( $fh );
-
-#my @result = BibTeX::Parser->_parse($fh);
-
- my $entry = $parser->next;
-
- is_deeply($entry, {_type => 'ARTICLE', _key => 'lin1973', author => "Shen Lin and Brian W. Kernighan",
- title => "An Effective Heuristic Algorithm for the Travelling-Salesman Problem",
- journal => "Operations Research",
- volume => 21,
- year => 1973,
- pages => "498--516", _parse_ok => 1,
- _fieldnums => {'author' => 0, 'title' => 1,
- 'journal' => 2, 'volume' => 3,
- 'year' => 4, 'pages' => 5},
- _pre => "some\ntext",
- _raw => $string1}, "parse \@ARTICLE");
-
-}
-{
- my $string = q|@InProceedings{Herper:2001:MVS,
- author = {Henry Herper},
- title = {{M}odellierung von {S}ystemen: ein
- {A}pplikationsgebiet im {I}nformatikunterricht},
- booktitle = {Informatikunterricht und Medienbildung, INFOS 2001
- (9. Fachtagung Informatik und Schule, Paderborn
- 17.-20- September 2001) -- Tagungsband},
- editor = {Reinhard Keil-Slavik and Johannes Magenheim},
- year = {2001},
-}|;
- my $fh = IO::String->new($string);
-
- my $parser = BibTeX::Parser->new( $fh );
-
- my $entry = $parser->next;
-
- is_deeply($entry, {
- _type => 'INPROCEEDINGS',
- _key => 'Herper:2001:MVS',
- _fieldnums => {'author' => 0, 'title' => 1,
- 'booktitle' => 2, 'editor' => 3,
- 'year' => 4},
- author => "Henry Herper",
- title => "{M}odellierung von {S}ystemen: ein {A}pplikationsgebiet im {I}nformatikunterricht",
- booktitle => "Informatikunterricht und Medienbildung, INFOS 2001 (9. Fachtagung Informatik und Schule, Paderborn 17.-20- September 2001) -- Tagungsband",
- editor => "Reinhard Keil-Slavik and Johannes Magenheim",
- year => 2001,
- _parse_ok => 1,
- _pre => '',
- _raw => $string}, "parse \@ARTICLE");
-}
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/04-entry.t b/support/bibtexperllibs/BibTeX-Parser/t/04-entry.t
deleted file mode 100644
index 3ca9797011..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/04-entry.t
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More tests => 13;
-
-use BibTeX::Parser::Entry;
-
-
-my $entry = new BibTeX::Parser::Entry("type", "key", 1, {title => "title"});
-
-isa_ok($entry, "BibTeX::Parser::Entry");
-
-is($entry->type, "TYPE", "Entry::type get");
-
-$entry->type("newtype");
-
-is($entry->type, "NEWTYPE", "Entry::type set");
-
-is($entry->key, "key", "Entry::key get");
-
-$entry->key("newkey");
-
-is($entry->key, "newkey", "Entry::key set");
-
-is($entry->field("title"), "title", "Entry::field with new");
-
-$entry->field("title" => "newtitle");
-
-is($entry->field("title"), "newtitle", "Entry::field overwrite");
-
-$entry->field("year" => 2008);
-
-is($entry->field("year"), 2008, "Entry::field set");
-
-is($entry->field("pages"), undef, "Entry::field undef on unknown value");
-
-is($entry->fieldlist, 2, "size of fieldlist");
-
-ok($entry->has("title"), "Entry::has true on known value");
-
-ok($entry->has("year"), "Entry::has true on known value");
-
-ok( ! $entry->has("pages"), "Entry::has false on unknown value");
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/05-author.t b/support/bibtexperllibs/BibTeX-Parser/t/05-author.t
deleted file mode 100644
index 45bc5413df..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/05-author.t
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/perl
-
-use Test::More;
-
-use BibTeX::Parser::Author;
-
-# Names from Mittelbach, Goossens: The LaTeX Companion, Second Edition.
-my %names = (
- "Donald E. Knuth" => ["Donald E.", undef, "Knuth", undef],
- "John Chris Smith" => ["John Chris", undef, "Smith", undef],
- "Smith, John Chris" => ["John Chris", undef, "Smith", undef],
- "Thomas von Neumann" => ["Thomas", "von", "Neumann", undef],
- "von Neumann, Thomas" => ["Thomas", "von", "Neumann", undef],
- "Lopez Fernandez, Miguel" => ["Miguel", undef, "Lopez Fernandez", undef],
- "Pierre de la Porte" => ["Pierre", "de la", "Porte", undef],
- "Smith, Jr., Robert" => ["Robert", undef, "Smith", "Jr."],
- "von Smith, Jr., Robert" => ["Robert", "von", "Smith", "Jr."],
- "Johannes Martinus Albertus van de Groene Heide" => ["Johannes Martinus Albertus", "van de", "Groene Heide", undef],
- "Maria-Victoria Delgrande" => ["Maria-Victoria", undef, "Delgrande", undef],
- "Anonymous" => [undef, undef, "Anonymous", undef],
- "von Neumann" => [undef, "von", "Neumann", undef],
- "N. Tetteh-Lartey" => ["N.", undef, "Tetteh-Lartey", undef],
- "von Tetteh-Lartey, N." => ["N.", "von", "Tetteh-Lartey", undef],
- "von Tetteh-Lartey, Jr., N." => ["N.", "von", "Tetteh-Lartey", "Jr."],
- "" => [undef, undef, undef, undef],
- " " => [undef, undef, undef, undef],
- "\n" => [undef, undef, undef, undef],
- "al." => [undef, undef, "al.", undef],
- "et.~al." => [undef, undef, "et.~al.", undef],
- "O'Malley, A." => ["A.", undef, "O'Malley", undef],
- "A. O'Malley" => ["A.", undef, "O'Malley", undef],
- "Arthur O'Malley" => ["Arthur", undef, "O'Malley", undef],
- "O'Malley, Arthur" => ["Arthur", undef, "O'Malley", undef],
- 'L.M. M\"uller' => ["L.M.", undef, 'M\"uller', undef],
- 'M\"uller, L.M.' => ["L.M.", undef, 'M\"uller', undef],
- 'L.M. M"uller' => ["L.M.", undef, 'M"uller', undef],
- 'M"uller, L.M.' => ["L.M.", undef, 'M"uller', undef],
- 'van Beethoven, Ludwig' => ["Ludwig", "van", "Beethoven", undef ],
- '{Barnes and Noble, Inc.}' => [undef, undef, '{Barnes and Noble, Inc.}', undef],
- "Ludwigg {van Beethoven}" => ["Ludwigg", undef, "{van Beethoven}", undef],
- '{van Beethoven}, Ludwig' => ["Ludwig", undef, "{van Beethoven}", undef ],
-);
-
-plan tests => (keys(%names) * 6 + 5);
-
-my $author = new BibTeX::Parser::Author;
-
-isa_ok($author, "BibTeX::Parser::Author", "Correct type");
-
-is($author->first, undef, "Initial state 'first'");
-is($author->von, undef, "Initial state 'von'");
-is($author->last, undef, "Initial state 'last'");
-is($author->jr, undef, "Initial state 'jr'");
-
-
-foreach my $name (keys %names) {
-
- is_deeply([BibTeX::Parser::Author->split($name)], $names{$name}, $name =~ /\w/ ? $name : "whitespace name: '$name'" );
-
- $author = new BibTeX::Parser::Author $name;
-
- isa_ok($author, "BibTeX::Parser::Author");
-
- is($author->first, $names{$name}->[0] );
- is($author->von, $names{$name}->[1]);
- is($author->last, $names{$name}->[2]);
- is($author->jr, $names{$name}->[3]);
-}
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/06-parse_complex.t b/support/bibtexperllibs/BibTeX-Parser/t/06-parse_complex.t
deleted file mode 100644
index 95a5848a71..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/06-parse_complex.t
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/perl
-
-use Test::More tests => 19;
-
-use strict;
-use IO::File;
-use BibTeX::Parser;
-
-my $fh = IO::File->new("t/bibs/06.bib");
-
-my $parser = new BibTeX::Parser $fh;
-
-
-my $entry = $parser->next;
-
-isa_ok($entry, 'BibTeX::Parser::Entry', "Correct type");
-ok($entry->parse_ok, "Entry parsed correctly");
-is($entry->type, "ARTICLE", "BibTeX type is correct");
-is($entry->field("title"), "Paper title", "Title attribute");
-is($entry->field("year"), 2008);
-is($entry->field("month"), "August", "Month expansion");
-is($entry->key, 'key1', "key");
-
-my @authors = $entry->author;
-is(scalar @authors, 2, "number of authors correct");
-my $author = shift @authors;
-is_deeply(
- [$author->first, $author->von, $author->last, $author->jr],
- ['Gerhard', undef, 'Gossen', undef], "author correct");
-
-$author = shift @authors;
-is_deeply(
- [$author->first, $author->von, $author->last, $author->jr],
- ['Ludwig', 'van', 'Beethoven', undef], "author correct");
-
-$entry = $parser->next;
-isa_ok($entry, 'BibTeX::Parser::Entry', "Correct type");
-ok($entry->parse_ok, "Entry parsed correctly");
-is($entry->type, "BOOK", "BibTeX type is correct");
-is($entry->field("title"), "Book title", "Title attribute");
-is($entry->field("year"), 2008);
-is($entry->field("month"), "August", "Month expansion");
-is($entry->key, 'key2', "key");
-@authors = $entry->author;
-is(scalar @authors, 1, "number of authors");
-is(scalar $entry->editor, 0, "number of editors");
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/07-parse_englishbib.t b/support/bibtexperllibs/BibTeX-Parser/t/07-parse_englishbib.t
deleted file mode 100644
index 3348a55248..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/07-parse_englishbib.t
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/perl
-
-use Test::More tests => 8;
-
-use strict;
-use IO::File;
-use BibTeX::Parser;
-
-
-my $fh = IO::File->new("t/bibs/english.bib");
-
-my $parser = new BibTeX::Parser $fh;
-
-my $count = 0;
-
-my $entry = $parser->next;
-
-is($entry->parse_ok, 0, "Ignore spurious @ before parenthesis");
-
-$entry = $parser->next;
-
-is($entry->parse_ok, 0, "Ignore spurious @ in email address");
-
-$entry = $parser->next;
-
-is(scalar $entry->author, 1, "# authors");
-#@BOOK{Carey,
-# AUTHOR="G. V. Carey",
-is($entry->field("title"), "Mind the Stop: A Brief Guide to Punctuation", "title");
-is($entry->field("publisher"), "Penguin", "publisher");
-is($entry->field("year"), 1958, "year");
-$count++;
-
-while ($entry = $parser->next) {
- $count++;
- if ($count == 8) {
- is( scalar $entry->author, 4, 'Last entry has 4 authors');
- }
-}
-
-
-is($count, 8, "number of entries");
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/08-parse_large.t b/support/bibtexperllibs/BibTeX-Parser/t/08-parse_large.t
deleted file mode 100644
index 5375d9a062..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/08-parse_large.t
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More skip_all => "Performance test", tests => 1;
-
-use IO::File;
-use BibTeX::Parser;
-
-my $starttime = time;
-
-my $fh = IO::File->new('t/bibs/java.bib'); #cl-nlp8x.bib');
-
-my $parser = new BibTeX::Parser $fh;
-my $entries = 0;
-
-#my @result = BibTeX::Parser->_parse($fh);
-
-while(my $entry = $parser->next) {
- $entries++;
-}
-
-my $parsetime = time - $starttime;
-
-warn "Parsed $entries entries in $parsetime seconds";
-ok(1, "Parsed $entries entries in $parsetime seconds");
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/09-complex.t b/support/bibtexperllibs/BibTeX-Parser/t/09-complex.t
deleted file mode 100644
index 56ce75cceb..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/09-complex.t
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More tests => 1;
-
-use IO::File;
-use BibTeX::Parser;
-
-
-my $fh = IO::File->new('t/bibs/09-complex.bib');
-
-my $parser = new BibTeX::Parser $fh;
-
-#my @result = BibTeX::Parser->_parse($fh);
-
-my $entry = $parser->next;
-
-is_deeply($entry, {_type => 'ARTICLE', _key => 'Ahrenberg88',
- author => "L. Ahrenberg and A. Jonsson",
- title => "An interactive system for tagging dialogues",
- journal => 'Literary \& Linguistic Computing',
- volume => 3,
- number => "2",
- pages => "66--70",
- year => "1988",
- keywords => "conver",
- _fieldnums => {'author' => 0, 'title' => 1,
- 'journal' => 2, 'volume' => 3,
- 'number' => 4, 'pages'=> 5,
- 'year' => 6, 'keywords' => 7},
- _parse_ok => 1,
- _raw => '@Article{Ahrenberg88,
- author = "L. Ahrenberg and A. Jonsson",
- title = "An interactive system for tagging dialogues",
- journal = "Literary \& Linguistic Computing",
- volume = "3",
- number = "2",
- pages = "66--70",
- year = "1988",
- keywords = "conver",
-}',
- _pre => ''
- }, "parse \@ARTICLE");
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/10-funnyname.t b/support/bibtexperllibs/BibTeX-Parser/t/10-funnyname.t
deleted file mode 100644
index 8ab48396e9..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/10-funnyname.t
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More tests => 11;
-
-use IO::File;
-use BibTeX::Parser;
-
-my $fh = IO::File->new('t/bibs/10-funnyname.bib');
-
-my $parser = BibTeX::Parser->new($fh);
-
-#my @result = BibTeX::Parser->_parse($fh);
-
-my $entry = $parser->next;
-
-is_deeply(
- $entry,
- {
- _type => 'ARTICLE',
- _key => 'testkey',
- author => 'A. Bar and L.M. M\"uller',
- title => 'foo',
- journal => 'journal',
- volume => 1,
- number => 1,
- pages => 1,
- year => 2008,
- _parse_ok => 1,
- _fieldnums => {'year' => 0, 'title' => 1,
- 'author' => 2, 'journal' => 3,
- 'volume' => 4, 'number'=> 5,
- 'pages' => 6},
- _raw => '@article{testkey,
- year = {2008},
- title = "foo",
- author = {A. Bar and L.M. M\"uller},
- journal = {journal},
- volume = {1},
- number = {1},
- pages = {1},
-}',
- _pre => ''
- },
- "parse \@ARTICLE"
-);
-
-my @authors = $entry->author;
-
-pass("->author didn't loop forever");
-ok(@authors == 2, "Two authors");
-
-is($authors[0]->first, 'A.', "A1 first name");
-is($authors[0]->last, 'Bar', "A1 last name");
-ok(!$authors[0]->von, "A1 no 'von'");
-ok(!$authors[0]->jr, "A1 no 'jr'");
-
-is($authors[1]->first, 'L.M.', "A2 first name");
-is($authors[1]->last, 'M\"uller', "A2 last name");
-ok(!$authors[1]->von, "A2 no 'von'");
-ok(!$authors[1]->jr, "A2 no 'jr'");
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/11-split_braced.t b/support/bibtexperllibs/BibTeX-Parser/t/11-split_braced.t
deleted file mode 100644
index 85a29be86f..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/11-split_braced.t
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More tests => 12;
-
-use BibTeX::Parser;
-use IO::File;
-
-my @tokens = BibTeX::Parser::_split_braced_string("a and b", '\s+and\s+');
-is(scalar @tokens,2);
-is($tokens[0],'a');
-is($tokens[1],'b');
-
-@tokens = BibTeX::Parser::_split_braced_string("a {and} b", '\s+and\s+');
-is(scalar @tokens,1);
-is($tokens[0],'a {and} b');
-
-@tokens = BibTeX::Parser::_split_braced_string("a {and b", '\s+and\s+');
-is(scalar @tokens,0);
-
-@tokens = BibTeX::Parser::_split_braced_string("} a {", '\s+');
-is(scalar @tokens,0);
-
-@tokens = BibTeX::Parser::_split_braced_string("{a b} c {d}e u", '\s+');
-is(scalar @tokens,4);
-is($tokens[0],'{a b}');
-is($tokens[1],'c');
-is($tokens[2],'{d}e');
-is($tokens[3],'u');
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/12-von_token.t b/support/bibtexperllibs/BibTeX-Parser/t/12-von_token.t
deleted file mode 100644
index 6daceafa96..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/12-von_token.t
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More tests => 5;
-
-use BibTeX::Parser::Author;
-use IO::File;
-
-is(BibTeX::Parser::Author::_is_von_token('von'),1);
-is(BibTeX::Parser::Author::_is_von_token('Von'),0);
-is(BibTeX::Parser::Author::_is_von_token('\noop{von}Von'),1);
-is(BibTeX::Parser::Author::_is_von_token('\noop{Von}von'),0);
-is(BibTeX::Parser::Author::_is_von_token('\noop{AE}{\AE}schylus'),0);
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/13_output.t b/support/bibtexperllibs/BibTeX-Parser/t/13_output.t
deleted file mode 100644
index 02fb1cd26f..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/13_output.t
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More;
-
-use BibTeX::Parser;
-use IO::File;
-
-
-my $fh = new IO::File "t/bibs/01.bib", "r" ;
-
-my $parser = new BibTeX::Parser $fh;
-
-
-
-
-while (my $entry = $parser->next) {
- if($entry->key eq 'key01') {
- my $result1='@ARTICLE{key01,
- year = {1950},
- author = {Duck, Donald and Else, Someone},
- editor = {Itor, E. D. and Other, A. N.},
- title = {Title text},
- month = {January~1},
-}';
- my $result2='@ARTICLE{key01,
- year = {1950},
- author = {Donald Duck and Someone Else},
- editor = {E. D. Itor and A. N. Other},
- title = {Title text},
- month = {January~1},
-}';
- is($entry->to_string,$result1);
- is($entry->to_string(canonize_names=>0),$result2);
- }
-
-}
-
-done_testing();
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/14-extratext.t b/support/bibtexperllibs/BibTeX-Parser/t/14-extratext.t
deleted file mode 100644
index 0a663b043a..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/14-extratext.t
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/perl -w
-
-
-use Test::More tests => 6;
-
-use BibTeX::Parser;
-use IO::File;
-
-
-my $fh = new IO::File "t/bibs/14-extratext.bib", "r" ;
-
-my $parser = new BibTeX::Parser $fh;
-
-
-
-
-while (my $entry = $parser->next) {
-
- if($entry->key eq 'Partridge') {
- my $result1= '@BOOK{Partridge,
- author = {Partridge, Eric},
- title = {Use and Abuse: a Guide to Good {E}nglish},
- publisher = {Hamish Hamilton},
- edition = {4},
- year = {1970},
-}';
- my $result2 = "First published in 1947\n$result1";
- is($entry->to_string,$result1);
- is($entry->to_string(print_pre=>1),$result2);
- }
-
- if ($entry->key eq 'Cooper') {
- my $result1 = '@BOOK{Cooper,
- author = {Cooper, Bruce M.},
- title = {Writing Technical Reports},
- publisher = {Penguin},
- year = {1964},
-}';
- my $result2 = "\n\n$result1";
- is($entry->to_string,$result1);
- is($entry->to_string(print_pre=>1),$result2);
- }
-
-
- if ($entry->key eq 'Fowler-ModernEnglish') {
-
- my $result1 = '@BOOK{Fowler-ModernEnglish,
- author = {Fowler, H. W.},
- title = {[A Dictionary of] Modern {E}nglish Usage},
- publisher = {Oxford University Press},
- edition = {2},
- year = {1965},
-}';
- my $result2 = '
-
-
-First published in 1926
-'. $result1;
- is($entry->to_string,$result1);
- is($entry->to_string(print_pre=>1),$result2);
- }
-}
-
-done_testing();
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/15-capitalization.t b/support/bibtexperllibs/BibTeX-Parser/t/15-capitalization.t
deleted file mode 100644
index 4254f5c12f..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/15-capitalization.t
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More tests=>7;
-
-use BibTeX::Parser;
-use IO::File;
-
-
-my $fh = new IO::File "t/bibs/01.bib", "r" ;
-
-my $parser = new BibTeX::Parser $fh;
-
-
-
-
-while (my $entry = $parser->next) {
- if($entry->key eq 'key01') {
- my $result1='@ARTICLE{key01,
- year = {1950},
- author = {Duck, Donald and Else, Someone},
- editor = {Itor, E. D. and Other, A. N.},
- title = {Title text},
- month = {January~1},
-}';
- my $result2='@ARTICLE{key01,
- YEAR = {1950},
- AUTHOR = {Duck, Donald and Else, Someone},
- EDITOR = {Itor, E. D. and Other, A. N.},
- TITLE = {Title text},
- MONTH = {January~1},
-}';
- my $result3='@ARTICLE{key01,
- Year = {1950},
- Author = {Duck, Donald and Else, Someone},
- Editor = {Itor, E. D. and Other, A. N.},
- Title = {Title text},
- Month = {January~1},
-}';
- my $result4='@article{key01,
- year = {1950},
- author = {Duck, Donald and Else, Someone},
- editor = {Itor, E. D. and Other, A. N.},
- title = {Title text},
- month = {January~1},
-}';
- my $result5='@Article{key01,
- year = {1950},
- author = {Duck, Donald and Else, Someone},
- editor = {Itor, E. D. and Other, A. N.},
- title = {Title text},
- month = {January~1},
-}';
- is($entry->to_string,$result1);
- is($entry->to_string(field_capitalization=>'Lowercase'),
- $result1);
- is($entry->to_string(field_capitalization=>'Uppercase'),
- $result2);
- is($entry->to_string(field_capitalization=>'Titlecase'),
- $result3);
-
- is($entry->to_string(type_capitalization=>'Lowercase'),
- $result4);
- is($entry->to_string(type_capitalization=>'Uppercase'),
- $result1);
- is($entry->to_string(type_capitalization=>'Titlecase'),
- $result5);
- }
-
-}
-
-done_testing();
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/01.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/01.bib
deleted file mode 100644
index 7f6233d177..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/01.bib
+++ /dev/null
@@ -1,7 +0,0 @@
-@ARTICLE{key01,
- year = 1950,
- author = {Donald Duck and Someone Else},
- editor = {E. D. Itor and A. N. Other},
- title = {Title text},
- month = jan # "~1"
-}
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/06.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/06.bib
deleted file mode 100644
index 242ae662cc..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/06.bib
+++ /dev/null
@@ -1,27 +0,0 @@
-this is text, which is ignored by bibtex.
-
-@PREAMBLE{
- This is only used for BibTeX files used in LaTeX documents
-}
-
-@Comment{
- Comments are ignored too.
-}
-
-@ARTICLE{key1,
- author = {Gerhard Gossen and Ludwig van Beethoven},
- title = "Paper title",
- year = 2008,
- month = aug,
-}
-
-@STRING{ gerhard = "Gerhard" }
-
-@STRING{ gossen = "Gossen" }
-
-@BOOK{ key2,
- author = gerhard # " " # gossen,
- title = "Book title",
- year = "2008",
- month = aug,
-}
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/09-complex.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/09-complex.bib
deleted file mode 100644
index cacf322723..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/09-complex.bib
+++ /dev/null
@@ -1,11 +0,0 @@
-@Article{Ahrenberg88,
- author = "L. Ahrenberg and A. Jonsson",
- title = "An interactive system for tagging dialogues",
- journal = "Literary \& Linguistic Computing",
- volume = "3",
- number = "2",
- pages = "66--70",
- year = "1988",
- keywords = "conver",
-}
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/10-funnyname.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/10-funnyname.bib
deleted file mode 100644
index 050fbc0534..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/10-funnyname.bib
+++ /dev/null
@@ -1,10 +0,0 @@
-@article{testkey,
- year = {2008},
- title = "foo",
- author = {A. Bar and L.M. M\"uller},
- journal = {journal},
- volume = {1},
- number = {1},
- pages = {1},
-}
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/14-extratext.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/14-extratext.bib
deleted file mode 100644
index 56f96aa01b..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/14-extratext.bib
+++ /dev/null
@@ -1,22 +0,0 @@
-First published in 1947
-@BOOK{Partridge,
- AUTHOR="Eric Partridge",
- TITLE="Use and Abuse: a Guide to Good {E}nglish",
- PUBLISHER="Hamish Hamilton",
- EDITION="4", YEAR="1970"}
-
-
-@BOOK{Cooper,
- AUTHOR="Bruce M. Cooper",
- TITLE="Writing Technical Reports",
- PUBLISHER="Penguin", YEAR="1964"}
-
-
-
-First published in 1926
-@BOOK{Fowler-ModernEnglish,
- AUTHOR="H. W. Fowler",
- TITLE="[A Dictionary of] Modern {E}nglish Usage",
- PUBLISHER="Oxford University Press",
- EDITION="2", YEAR="1965"}
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/braces.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/braces.bib
deleted file mode 100644
index 3791fb5760..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/braces.bib
+++ /dev/null
@@ -1,21 +0,0 @@
-@Article{scholkopf98kpca,
- author = {Bernhard {Sch\"olkopf} and Alex Smola and K.R. Muller},
- title = {Nonlinear component analysis as a kernel eigenvalue
-problem},
- journal = {Neural Computation},
- year = {1998},
- volume = {10},
- pages = {1299--1319}
-}
-
-@article{brownetal93,
- author = {Peter F. Brown and Stephen A. {Della Pietra} and
- Vincent J. {Della Pietra} and Robert~L. Mercer},
- title = {The Mathematics of Statistical Machine Translation:
- Parameter Estimation},
- journal = {Computational Linguistics},
- year = 1993,
- volume = 19,
- number = 2,
- pages = {263-311}
-}
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/endnote.txt b/support/bibtexperllibs/BibTeX-Parser/t/bibs/endnote.txt
deleted file mode 100644
index e75f1d2050..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/endnote.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-@article{
- volume = {59},
- number = {6},
- year = {1999}
-}
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/engineering_village.txt b/support/bibtexperllibs/BibTeX-Parser/t/bibs/engineering_village.txt
deleted file mode 100644
index 256f5a853d..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/engineering_village.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-@inproceedings{1997493856789 ,
-language = {English},
-year = {1997},
-}
-
-
-@inproceedings{1998043944915 ,
-language = {English},
-year = {1997},
-}
-
-
-@article{2003137419501 ,
-language = {English},
-year = {2002},
-}
-
-
-@inproceedings{2002367072517 ,
-language = {English},
-year = {2002},
-}
-
-
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/english.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/english.bib
deleted file mode 100644
index f0f097409f..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/english.bib
+++ /dev/null
@@ -1,55 +0,0 @@
-$Id: @(#) english.bib 1.0 23-OCT-1989 17:10:00 Aston archive$
-
-Please notify Adrian F Clark <alien@uk.ac.essex.ese> of any additions
-or corrections to this list.
-
-@BOOK{Carey,
- AUTHOR="G. V. Carey",
- TITLE="Mind the Stop: A Brief Guide to Punctuation",
- PUBLISHER="Penguin", YEAR="1958"}
-
-@BOOK{Cooper,
- AUTHOR="Bruce M. Cooper",
- TITLE="Writing Technical Reports",
- PUBLISHER="Penguin", YEAR="1964"}
-
-@BOOK{Fowler-ModernEnglish,
- AUTHOR="H. W. Fowler",
- TITLE="[A Dictionary of] Modern {E}nglish Usage",
- PUBLISHER="Oxford University Press",
- EDITION="2", YEAR="1965"}
- (but first published in 1926)
-
-@BOOK{Fowler-KingsEnglish,
- AUTHOR="H. W. Fowler and F. G. Fowler",
- TITLE="The {K}ing's {E}nglish",
- PUBLISHER="Oxford University Press",
- EDITION="3", YEAR="1931"}
- (but first published in 1906)
-
-@BOOK{Gowers,
- AUTHOR="Sir Ernest Gowers",
- TITLE="The Complete Plain Words",
- PUBLISHER="Penguin", YEAR="1954"}
- (but first published by HMSO)
-
-@BOOK{Hart,
- AUTHOR="Horace Hart",
- TITLE="[Hart's] Rules for Compositors and Readers
- [at the Oxford University Press]",
- PUBLISHER="Oxford University Press",
- EDITION="39", YEAR="1983"}
- (but first published in 1893)
-
-@BOOK{Partridge,
- AUTHOR="Eric Partridge",
- TITLE="Use and Abuse: a Guide to Good {E}nglish",
- PUBLISHER="Hamish Hamilton",
- EDITION="4", YEAR="1970"}
- (but first published in 1947)
-
-@BOOK{Quirk-CompGram,
- AUTHOR="Randolph Quirk and Sydney Greenbaum and Geoffrey Leach and
- Jan Svartnik",
- TITLE="A Comprehensive Grammar of the {E}nglish Language",
- PUBLISHER="Longman", YEAR="1985"}
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/mathscinet.txt b/support/bibtexperllibs/BibTeX-Parser/t/bibs/mathscinet.txt
deleted file mode 100644
index eea5a05a70..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/mathscinet.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-MathSciNet </mathscinet/index.html>
-
- *
- Clipboard </mathscinet/clipboard.html>
- * Home </mathscinet/index.html>
- * Preferences </mathscinet/preferences.html>
- * Help </mathscinet/help/headline_review_help_full.html>
- * Support Mail </mathscinet/support_mail.html>
- * Terms of Use </mathscinet/help/mathscinet_terms_of_use.html>
- * University of Southampton
-
-@article {MR2254280,
- VOLUME = {23},
- YEAR = {2006},
-}
-
-
-@article {MR2254274,
- VOLUME = {23},
- YEAR = {2006},
-}
-
-
-@article {MR2248052,
- VOLUME = {23},
- YEAR = {2006},
-}
-
-
-*Matches:* 3
-Mirror Sites
-
-
-© Copyright 2011, American Mathematical Society
-<http://www.ams.org/ams/copyright.html>
-Privacy Statement <http://www.ams.org/ams/privacy.html>
-American Mathematical Society <http://www.ams.org>
-American Mathematical Society
-201 Charles Street
-Providence, RI 02904-2294
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bug66325.t b/support/bibtexperllibs/BibTeX-Parser/t/bug66325.t
deleted file mode 100644
index ac83b43aa9..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/bug66325.t
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More;
-
-use BibTeX::Parser;
-use IO::File;
-
-{
- my $fh = new IO::File "t/bibs/endnote.txt", "r" ;
-
- if (defined $fh) {
- my $parser = new BibTeX::Parser $fh;
-
- while (my $entry = $parser->next) {
- isa_ok($entry, "BibTeX::Parser::Entry");
- ok($entry->parse_ok, "parse_ok");
- is($entry->key, undef, "key");
- is($entry->type, "ARTICLE", "type");
- is($entry->field("year"), 1999, "field");
- is($entry->field("volume"), 59, "first field");
- }
- }
-}
-
-{
- my $fh = new IO::File "t/bibs/mathscinet.txt", "r" ;
- my @keys = qw(MR2254280 MR2254274 MR2248052);
-
- if (defined $fh) {
- my $parser = new BibTeX::Parser $fh;
- my $count = 0;
-
- while (my $entry = $parser->next) {
- isa_ok($entry, "BibTeX::Parser::Entry");
- ok($entry->parse_ok, "parse_ok");
- is($entry->key, $keys[$count], "key");
- is($entry->type, "ARTICLE", "type");
- is($entry->field("volume"), 23, "first field");
- is($entry->field("year"), 2006, "field");
- $count++;
- }
-
- is($count, 3, "number of entries");
- }
-}
-
-{
- my $fh = new IO::File "t/bibs/engineering_village.txt", "r" ;
-
- my @types = qw( inproceedings inproceedings article inproceedings );
- my @keys = qw( 1997493856789 1998043944915 2003137419501 2002367072517 );
- my @years = qw( 1997 1997 2002 2002 );
-
- if (defined $fh) {
- my $parser = new BibTeX::Parser $fh;
- my $count = 0;
-
- while (my $entry = $parser->next) {
- isa_ok($entry, "BibTeX::Parser::Entry");
- ok($entry->parse_ok, "parse_ok");
- is($entry->key, $keys[$count], "key");
- is($entry->type, uc $types[$count], "type");
- is($entry->field("language"), "English", "first field");
- is($entry->field("year"), $years[$count], "field");
- $count++;
- }
-
- is($count, 4, "number of entries");
- }
-}
-done_testing;
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bug67419.t b/support/bibtexperllibs/BibTeX-Parser/t/bug67419.t
deleted file mode 100644
index 0f944f373a..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/bug67419.t
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/perl -w
-
-use Test::More;
-
-use BibTeX::Parser;
-use IO::File;
-
-my $fh = new IO::File "t/bibs/braces.bib", "r" ;
-my $parser = new BibTeX::Parser $fh;
-while (my $entry=$parser->next) {
- is($entry->parse_ok,1);
- if ($entry->key eq 'scholkopf98kpca') {
- @authors=$entry->author;
- is(scalar @authors,3);
- is("$authors[0]", '{Sch\"olkopf}, Bernhard');
- is("$authors[1]", 'Smola, Alex');
- is("$authors[2]", 'Muller, K.R.');
- }
- if ($entry->key eq 'brownetal93') {
- @authors=$entry->author;
- is(scalar @authors,4);
- is("$authors[0]", 'Brown, Peter F.');
- is("$authors[1]", '{Della Pietra}, Stephen A.');
- is("$authors[2]", '{Della Pietra}, Vincent J.');
- is("$authors[3]", 'Mercer, Robert~L.');
- }
-}
-
-done_testing();
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/cleaned_field.t b/support/bibtexperllibs/BibTeX-Parser/t/cleaned_field.t
deleted file mode 100644
index 980fb1d60d..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/cleaned_field.t
+++ /dev/null
@@ -1,143 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-use utf8;
-
-use Test::More;
-use BibTeX::Parser::Entry;
-
-sub new_entry {
- BibTeX::Parser::Entry->new( 'ARTICLE', 'Foo2010', 1, { @_ } );
-}
-{
- my @german_tests = (
- [ '"a' => 'ä' ],
- ['"`' => '„' ],
- ["\"'" => '“' ],
- );
-
- foreach my $test ( @german_tests ) {
- my $entry = new_entry( foo => $test->[0] );
- is( $entry->cleaned_field( 'foo', german => 1 ), $test->[1], "Convert $test->[0], german => 1" );
- }
-}
-
-{
- binmode( DATA, ':utf8' );
- while (<DATA>) {
- chomp;
- my ( $tex, $result ) = split /\t/;
- is( new_entry( foo => $tex )->cleaned_field( 'foo' ), $result, "Convert $tex" );
- }
- close DATA;
-}
-
-{
- my $entry_with_authors = new_entry( author => 'F{\"o}o Bar and B"ar, F.' );
- my @authors = $entry_with_authors->author;
- is( scalar @authors, 2, "Number of authors is correct");
- is( $authors[0]->first, 'F{\"o}o', "non-cleaned version of first" );
- is( $authors[0]->last, 'Bar', "non-cleaned version of last" );
-
- is( $authors[1]->first, 'F.', "non-cleaned version of first" );
- is( $authors[1]->last, 'B"ar', "non-cleaned version of last" );
-
- my @clean_authors = $entry_with_authors->cleaned_author;
- is( $clean_authors[0]->first, 'Föo', "cleaned version of first" );
- is( $clean_authors[0]->last, 'Bar', "cleaned version of last" );
-
- is( $clean_authors[1]->first, 'F.', "cleaned version of first" );
- is( $clean_authors[1]->last, 'B"ar', "cleaned version of last" );
-}
-done_testing;
-
-__DATA__
-\# #
-\& &
-{\`a} à
-{\^a} â
-{\~a} ã
-{\'a} á
-{\'{a}} á
-{\"a} ä
-{\`A} À
-{\'A} Á
-{\"A} Ä
-{\aa} å
-{\AA} Å
-{\ae} æ
-{\bf 12} 12
-{\'c} ć
-{\cal P} P
-{\c{c}} ç
-{\c{C}} Ç
-{\c{e}} ȩ
-{\c{s}} ş
-{\c{S}} Ş
-{\c{t}} ţ
-{\-d} d
-{\`e} è
-{\^e} ê
-{\'e} é
-{\"e} ë
-{\'E} É
-{\em bits} bits
-{\H{o}} ő
-{\`i} ì
-{\^i} î
-{\i} ı
-{\`i} ì
-{\'i} í
-{\"i} ï
-{\`\i} ì
-{\'\i} í
-{\"\i} ï
-{\`{\i}} ì
-{\'{\i}} í
-{\"{\i}} ï
-{\it Note} Note
-{\k{e}} ę
-{\l} ł
-{\-l} l
-{\log} log
-{\~n} ñ
-{\'n} ń
-{\^o} ô
-{\o} ø
-{\'o} ó
-{\"o} ö
-{\"{o}} ö
-{\'O} Ó
-{\"O} Ö
-{\"{O}} Ö
-{\rm always} always
-{\-s} s
-{\'s} ś
-{\sc JoiN} JoiN
-{\sl bit\/ \bf 7} bit 7
-{\sl L'Informatique Nouvelle} L’Informatique Nouvelle
-{\small and} and
-{\ss} ß
-{\TeX} TeX
-{\TM} ™
-{\tt awk} awk
-{\^u} û
-{\'u} ú
-{\"u} ü
-{\"{u}} ü
-{\'U} Ú
-{\"U} Ü
-{\u{a}} ă
-{\u{g}} ğ
-{\v{c}} č
-{\v{C}} Č
-{\v{e}} ě
-{\v{n}} ň
-{\v{r}} ř
-{\v{s}} š
-{\v{S}} Š
-{\v{z}} ž
-{\v{Z}} Ž
-{\'y} ý
-{\.{z}} ż
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/pod-coverage.t b/support/bibtexperllibs/BibTeX-Parser/t/pod-coverage.t
deleted file mode 100644
index fc40a57c2a..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/pod-coverage.t
+++ /dev/null
@@ -1,18 +0,0 @@
-use strict;
-use warnings;
-use Test::More;
-
-# Ensure a recent version of Test::Pod::Coverage
-my $min_tpc = 1.08;
-eval "use Test::Pod::Coverage $min_tpc";
-plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage"
- if $@;
-
-# Test::Pod::Coverage doesn't require a minimum Pod::Coverage version,
-# but older versions don't recognize some common documentation styles
-my $min_pc = 0.18;
-eval "use Pod::Coverage $min_pc";
-plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage"
- if $@;
-
-all_pod_coverage_ok();
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/pod.t b/support/bibtexperllibs/BibTeX-Parser/t/pod.t
deleted file mode 100644
index e22a39b524..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/pod.t
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use warnings;
-use Test::More;
-
-# Ensure a recent version of Test::Pod
-my $min_tp = 1.22;
-eval "use Test::Pod $min_tp";
-plan skip_all => "Test::Pod $min_tp required for testing POD" if $@;
-
-all_pod_files_ok();
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/release-pod-coverage.t b/support/bibtexperllibs/BibTeX-Parser/t/release-pod-coverage.t
deleted file mode 100644
index 3a818499f0..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/release-pod-coverage.t
+++ /dev/null
@@ -1,21 +0,0 @@
-#!perl
-
-BEGIN {
- unless ($ENV{RELEASE_TESTING}) {
- require Test::More;
- Test::More::plan(skip_all => 'these tests are for release candidate testing');
- }
-}
-
-
-use Test::More;
-
-eval "use Test::Pod::Coverage 1.08";
-plan skip_all => "Test::Pod::Coverage 1.08 required for testing POD coverage"
- if $@;
-
-eval "use Pod::Coverage::TrustPod";
-plan skip_all => "Pod::Coverage::TrustPod required for testing POD coverage"
- if $@;
-
-all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' });
diff --git a/support/bibtexperllibs/BibTeX-Parser/t/release-pod-syntax.t b/support/bibtexperllibs/BibTeX-Parser/t/release-pod-syntax.t
deleted file mode 100644
index d46a955694..0000000000
--- a/support/bibtexperllibs/BibTeX-Parser/t/release-pod-syntax.t
+++ /dev/null
@@ -1,15 +0,0 @@
-#!perl
-
-BEGIN {
- unless ($ENV{RELEASE_TESTING}) {
- require Test::More;
- Test::More::plan(skip_all => 'these tests are for release candidate testing');
- }
-}
-
-use Test::More;
-
-eval "use Test::Pod 1.41";
-plan skip_all => "Test::Pod 1.41 required for testing POD" if $@;
-
-all_pod_files_ok();
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/Changes b/support/bibtexperllibs/LaTeX-ToUnicode/Changes
deleted file mode 100644
index 3db5c19724..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/Changes
+++ /dev/null
@@ -1,27 +0,0 @@
-Changes for LaTeX::ToUnicode
-
-0.54 2023-11-17 Better handling of \{ \}. New release
-
-0.53 2023-08-20 Tests fixed, new release
-
-0.52 2022-11-07 Support many more control sequences, \kern removal,
- \<newline>, etc. Add ltxunitxt script to access functionality
- from command line.
-
-0.11 2020-12-12 Updates and cleaing
-
-0.05 2016-11-23 02:28:35+00:00
- Compatibility with perl 5.25 (Alexandr Ciornii)
-
-0.04 2015-12-25 19:16:41+00:00
- Macrons are handled properly
-
-0.03 2010-10-18 18:04:14
- Specify minimal perl version (5.8.0) for UTF-8 support
-
-0.02 2010/07/09
- Handle accents with \i
- Add script used to generate accents table
-
-0.01 2010/07/09
- First release.
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/LICENSE b/support/bibtexperllibs/LaTeX-ToUnicode/LICENSE
deleted file mode 100644
index c3402b3869..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/LICENSE
+++ /dev/null
@@ -1,375 +0,0 @@
-Copyright 2010-2023 Gerhard Gossen, Boris Veytsman, Karl Berry
-
-This is free software; you can redistribute it and/or modify it under
-the same terms as the Perl 5 programming language system itself.
-
-Terms of the Perl programming language system itself
-
-a) the GNU General Public License as published by the Free
- Software Foundation; either version 1, or (at your option) any
- later version, or
-b) the "Artistic License"
-
---- The GNU General Public License, Version 1, February 1989 ---
-
-This is free software, licensed under:
-
- The GNU General Public License, Version 1, February 1989
-
- GNU GENERAL PUBLIC LICENSE
- Version 1, February 1989
-
- Copyright (C) 1989 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The license agreements of most software companies try to keep users
-at the mercy of those companies. By contrast, our General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. The
-General Public License applies to the Free Software Foundation's
-software and to any other program whose authors commit to using it.
-You can use it for your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Specifically, the General Public License is designed to make
-sure that you have the freedom to give away or sell copies of free
-software, 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 make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of a such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must tell them their rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any program or other work which
-contains a notice placed by the copyright holder saying it may be
-distributed under the terms of this General Public License. The
-"Program", below, refers to any such program or work, and a "work based
-on the Program" means either the Program or any work containing the
-Program or a portion of it, either verbatim or with modifications. Each
-licensee is addressed as "you".
-
- 1. You may copy and distribute 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 and
-disclaimer of warranty; keep intact all the notices that refer to this
-General Public License and to the absence of any warranty; and give any
-other recipients of the Program a copy of this General Public License
-along with the Program. You may charge a fee for the physical act of
-transferring a copy.
-
- 2. You may modify your copy or copies of the Program or any portion of
-it, and copy and distribute such modifications under the terms of Paragraph
-1 above, provided that you also do the following:
-
- a) cause the modified files to carry prominent notices stating that
- you changed the files and the date of any change; and
-
- b) cause the whole of any work that you distribute or publish, that
- in whole or in part contains the Program or any part thereof, either
- with or without modifications, to be licensed at no charge to all
- third parties under the terms of this General Public License (except
- that you may choose to grant warranty protection to some or all
- third parties, at your option).
-
- c) If the modified program normally reads commands interactively when
- run, you must cause it, when started running for such interactive use
- in the simplest and most usual way, to print or display an
- announcement including an appropriate copyright notice and a notice
- that there is no warranty (or else, saying that you provide a
- warranty) and that users may redistribute the program under these
- conditions, and telling the user how to view a copy of this General
- Public License.
-
- d) You may charge a fee for the physical act of transferring a
- copy, and you may at your option offer warranty protection in
- exchange for a fee.
-
-Mere aggregation of another independent work with the Program (or its
-derivative) on a volume of a storage or distribution medium does not bring
-the other work under the scope of these terms.
-
- 3. You may copy and distribute the Program (or a portion or derivative of
-it, under Paragraph 2) in object code or executable form under the terms of
-Paragraphs 1 and 2 above provided that you also do one of the following:
-
- a) accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of
- Paragraphs 1 and 2 above; or,
-
- b) accompany it with a written offer, valid for at least three
- years, to give any third party free (except for a nominal charge
- for the cost of distribution) a complete machine-readable copy of the
- corresponding source code, to be distributed under the terms of
- Paragraphs 1 and 2 above; or,
-
- c) accompany it with the information you received as to where the
- corresponding source code may be obtained. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form alone.)
-
-Source code for a work means the preferred form of the work for making
-modifications to it. For an executable file, complete source code means
-all the source code for all modules it contains; but, as a special
-exception, it need not include source code for modules which are standard
-libraries that accompany the operating system on which the executable
-file runs, or for standard header files or definitions files that
-accompany that operating system.
-
- 4. You may not copy, modify, sublicense, distribute or transfer the
-Program except as expressly provided under this General Public License.
-Any attempt otherwise to copy, modify, sublicense, distribute or transfer
-the Program is void, and will automatically terminate your rights to use
-the Program under this License. However, parties who have received
-copies, or rights to use copies, from you under this General Public
-License will not have their licenses terminated so long as such parties
-remain in full compliance.
-
- 5. By copying, distributing or modifying the Program (or any work based
-on the Program) you indicate your acceptance of this license to do so,
-and all its terms and conditions.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the original
-licensor to copy, distribute or modify the Program subject to these
-terms and conditions. You may not impose any further restrictions on the
-recipients' exercise of the rights granted herein.
-
- 7. The Free Software Foundation may publish revised and/or new versions
-of the 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 a version number of the license which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-the license, you may choose any version ever published by the Free Software
-Foundation.
-
- 8. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
-
- 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE 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.
-
- END OF TERMS AND CONDITIONS
-
- Appendix: 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 humanity, 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 convey
-the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) 19yy <name of author>
-
- 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 1, 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, write to the Free Software Foundation,
- Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) 19xx name of author
- Gnomovision 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, the
-commands you use may be called something other than `show w' and `show
-c'; they could even be mouse-clicks or menu items--whatever suits your
-program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- program `Gnomovision' (a program to direct compilers to make passes
- at assemblers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
---- The Artistic License 1.0 ---
-
-This software is Copyright (c) 2010 by Gerhard Gossen.
-
-This is free software, licensed under:
-
- The Artistic License 1.0
-
-The Artistic License
-
-Preamble
-
-The intent of this document is to state the conditions under which a Package
-may be copied, such that the Copyright Holder maintains some semblance of
-artistic control over the development of the package, while giving the users of
-the package the right to use and distribute the Package in a more-or-less
-customary fashion, plus the right to make reasonable modifications.
-
-Definitions:
-
- - "Package" refers to the collection of files distributed by the Copyright
- Holder, and derivatives of that collection of files created through
- textual modification.
- - "Standard Version" refers to such a Package if it has not been modified,
- or has been modified in accordance with the wishes of the Copyright
- Holder.
- - "Copyright Holder" is whoever is named in the copyright or copyrights for
- the package.
- - "You" is you, if you're thinking about copying or distributing this Package.
- - "Reasonable copying fee" is whatever you can justify on the basis of media
- cost, duplication charges, time of people involved, and so on. (You will
- not be required to justify it to the Copyright Holder, but only to the
- computing community at large as a market that must bear the fee.)
- - "Freely Available" means that no fee is charged for the item itself, though
- there may be fees involved in handling the item. It also means that
- recipients of the item may redistribute it under the same conditions they
- received it.
-
-1. You may make and give away verbatim copies of the source form of the
-Standard Version of this Package without restriction, provided that you
-duplicate all of the original copyright notices and associated disclaimers.
-
-2. You may apply bug fixes, portability fixes and other modifications derived
-from the Public Domain or from the Copyright Holder. A Package modified in such
-a way shall still be considered the Standard Version.
-
-3. You may otherwise modify your copy of this Package in any way, provided that
-you insert a prominent notice in each changed file stating how and when you
-changed that file, and provided that you do at least ONE of the following:
-
- a) place your modifications in the Public Domain or otherwise make them
- Freely Available, such as by posting said modifications to Usenet or an
- equivalent medium, or placing the modifications on a major archive site
- such as ftp.uu.net, or by allowing the Copyright Holder to include your
- modifications in the Standard Version of the Package.
-
- b) use the modified Package only within your corporation or organization.
-
- c) rename any non-standard executables so the names do not conflict with
- standard executables, which must also be provided, and provide a separate
- manual page for each non-standard executable that clearly documents how it
- differs from the Standard Version.
-
- d) make other distribution arrangements with the Copyright Holder.
-
-4. You may distribute the programs of this Package in object code or executable
-form, provided that you do at least ONE of the following:
-
- a) distribute a Standard Version of the executables and library files,
- together with instructions (in the manual page or equivalent) on where to
- get the Standard Version.
-
- b) accompany the distribution with the machine-readable source of the Package
- with your modifications.
-
- c) accompany any non-standard executables with their corresponding Standard
- Version executables, giving the non-standard executables non-standard
- names, and clearly documenting the differences in manual pages (or
- equivalent), together with instructions on where to get the Standard
- Version.
-
- d) make other distribution arrangements with the Copyright Holder.
-
-5. You may charge a reasonable copying fee for any distribution of this
-Package. You may charge any fee you choose for support of this Package. You
-may not charge a fee for this Package itself. However, you may distribute this
-Package in aggregate with other (possibly commercial) programs as part of a
-larger (possibly commercial) software distribution provided that you do not
-advertise this Package as a product of your own.
-
-6. The scripts and library files supplied as input to or produced as output
-from the programs of this Package do not automatically fall under the copyright
-of this Package, but belong to whomever generated them, and may be sold
-commercially, and may be aggregated with this Package.
-
-7. C or perl subroutines supplied by you and linked into this Package shall not
-be considered part of this Package.
-
-8. The name of the Copyright Holder may not be used to endorse or promote
-products derived from this software without specific prior written permission.
-
-9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
-MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-
-The End
-
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/MANIFEST b/support/bibtexperllibs/LaTeX-ToUnicode/MANIFEST
deleted file mode 100644
index 2aa0688c10..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/MANIFEST
+++ /dev/null
@@ -1,17 +0,0 @@
-LICENSE
-Changes
-MANIFEST
-t/release-pod-coverage.t
-t/release-pod-syntax.t
-t/convert.t
-t/release-synopsis.t
-README
-script/ltx2unitxt
-script/convert.pl
-lib/LaTeX/ToUnicode/Tables.pm
-lib/LaTeX/ToUnicode.pm
-Makefile.PL
-head.ltx
-Makefile.TDS
-weaver.ini
-dist.ini
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/Makefile.PL b/support/bibtexperllibs/LaTeX-ToUnicode/Makefile.PL
deleted file mode 100644
index 7aa2b21234..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/Makefile.PL
+++ /dev/null
@@ -1,51 +0,0 @@
-
-use strict;
-use warnings;
-
-BEGIN { require 5.8.0; }
-
-use ExtUtils::MakeMaker 6.31;
-
-
-
-my %WriteMakefileArgs = (
- 'ABSTRACT' => 'Convert LaTeX commands to Unicode',
- 'AUTHOR' => 'Gerhard Gossen <gerhard.gossen@googlemail.com> and Boris Veytsman <boris@varphi.com> and Karl Berry <karl@freefriends.com>',
- 'BUILD_REQUIRES' => {
- 'Pod-LaTeX' => '0.61'
- },
- 'CONFIGURE_REQUIRES' => {
- 'ExtUtils::MakeMaker' => '6.31'
- },
- 'DISTNAME' => 'LaTeX-ToUnicode',
- 'EXE_FILES' => ['script/ltx2unitxt'],
- 'LICENSE' => 'perl',
- 'NAME' => 'LaTeX::ToUnicode',
- 'PREREQ_PM' => {},
- 'VERSION_FROM' => 'lib/LaTeX/ToUnicode.pm',
- 'test' => {
- 'TESTS' => 't/*.t'
- }
-);
-
-
-unless ( eval { ExtUtils::MakeMaker->VERSION(6.56) } ) {
- my $br = delete $WriteMakefileArgs{BUILD_REQUIRES};
- my $pp = $WriteMakefileArgs{PREREQ_PM};
- for my $mod ( keys %$br ) {
- if ( exists $pp->{$mod} ) {
- $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod};
- }
- else {
- $pp->{$mod} = $br->{$mod};
- }
- }
-}
-
-delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
- unless eval { ExtUtils::MakeMaker->VERSION(6.52) };
-
-WriteMakefile(%WriteMakefileArgs);
-
-
-
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/Makefile.TDS b/support/bibtexperllibs/LaTeX-ToUnicode/Makefile.TDS
deleted file mode 100644
index 4255cfa6b6..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/Makefile.TDS
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# This is Makefile for TDS-compliant TeX distributions
-# Written by Boris Veytsman, boris@varphi.com
-#
-# This file is in public domain
-#
-PREFIX = /usr/local
-
-LIBDIR = $(PREFIX)/scripts/bibtexperllibs
-
-DOCDIR = $(PREFIX)/doc/bibtex/bibtexperllibs
-
-DOCS = latex-tounicode.pdf ltx2unitxt.pdf ltx2unitxt.1
-
-all:
-
-docs: $(DOCS)
-
-latex-tounicode.pdf: latex-tounicode.tex ltx2unitxt.pdf
- texfot pdflatex $< || { rm -f $@; exit 1; }
-
-ToUnicode = lib/LaTeX/ToUnicode
-
-latex-tounicode.tex: $(ToUnicode).pm $(ToUnicode)/Tables.pm
- pod2latex -modify -full -prefile head.ltx -out $@ $^
-
-latex-tounicode.tex: head.ltx
-# unfortunately pod2latex doesn't recognize =encoding, so there
-# are two warnings of "Command encoding not recognised ...". Oh well.
-
-ltx2unitxt.1: script/ltx2unitxt
-# don't run --version since the --help message includes --version output.
- help2man --no-info --version-string=" " \
---name="convert LaTeX source fragment to plain (Unicode) text or simple html" \
- $< >$@ \
- || { rm -f $@; exit 1; }
-ltx2unitxt.pdf: ltx2unitxt.1
- sed 's/^Releases:/\nReleases:/' $< | groff -man -t -rS11 - | ps2pdf - $@
-
-force:
-
-install: all docs
- mkdir -p $(LIBDIR)
- cp -r lib/* $(LIBDIR)
- mkdir -p $(DOCDIR)
- cp -r man/man3/* $(DOCDIR)
- cp -r latex-tounicode.pdf ltx2unitxt.pdf ltx2unitxt.1 $(DOCDIR)
-
-clean:
- $(RM) *.log *.aux *.out *.toc latex-tounicode.tex *.tar.gz
-
-distclean: clean
- $(RM) $(DOCS) \ No newline at end of file
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/README b/support/bibtexperllibs/LaTeX-ToUnicode/README
deleted file mode 100644
index 1f241e3979..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/README
+++ /dev/null
@@ -1,13 +0,0 @@
-This is the LaTeX::ToUnicode Perl package:
-
- Convert LaTeX source fragments to Unicode plain text or simple html
-
-Dev sources, bug tracker: https://github.com/borisveytsman/bibtexperllibs
-Releases: https://ctan.org/pkg/bibtexperllibs
-
-Copyright 2010-2022 Gerhard Gossen, Boris Veytsman, Karl Berry
-
-This is free software; you can redistribute it and/or modify it under
-the same terms as the Perl5 programming language system itself.
-
-
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/dist.ini b/support/bibtexperllibs/LaTeX-ToUnicode/dist.ini
deleted file mode 100644
index 5c038d1985..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/dist.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-name = LaTeX-ToUnicode
-author = Gerhard Gossen <gerhard.gossen@googlemail.com> and Boris Veytsman <boris@varphi.com> and Karl Berry <karl@freefriends.org>
-license = Perl_5
-copyright_holder = Gerhard Gossen and Boris Veytsman
-copyright_year = 2010-2023
-version = 0.53
-
-[@Classic]
-[Prereqs]
-perl = 5.8.0
-[NextRelease]
-format = %-7v %{yyyy-MM-dd HH:mm:ss}d
-[PodWeaver]
-[Repository]
-[@Git]
-[SynopsisTests]
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/head.ltx b/support/bibtexperllibs/LaTeX-ToUnicode/head.ltx
deleted file mode 100644
index 3f946fcba0..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/head.ltx
+++ /dev/null
@@ -1,28 +0,0 @@
-% documentation for LaTeX::ToUnicode.
-% head.ltx file public domain.
-%
-\documentclass[11pt]{article}
-\usepackage{fullpage,pdfpages}
-\usepackage[hidelinks]{hyperref}
-\let\printindex=\empty % index is not useful
-\sloppy \hbadness=3000 % not aiming for good typesetting
-
-% Silence useless font warning about braces in cmsy instead of cmtt:
-\makeatletter\def\@font@warning#1{}\makeatother
-
-% https://tex.stackexchange.com/questions/68272
-\newcommand\invisiblesection[1]{%
- \refstepcounter{section}%
- \addcontentsline{toc}{section}{\protect\numberline{\thesection}#1}%
- \sectionmark{#1}%
-}
-
-\begin{document}
-\title{\texttt{LaTeX::ToUnicode} documentation}
-\author{Boris Veytsman\thanks{borisv@lk.net}}
-\maketitle
-\tableofcontents
-
-\invisiblesection{ltx2unitxt---convert \LaTeX\ source fragments}
-
-\includepdf[pages=-]{ltx2unitxt}
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/latex-tounicode.pdf b/support/bibtexperllibs/LaTeX-ToUnicode/latex-tounicode.pdf
deleted file mode 100644
index b319b6ebcb..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/latex-tounicode.pdf
+++ /dev/null
Binary files differ
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode.pm b/support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode.pm
deleted file mode 100644
index 1759a6acd6..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode.pm
+++ /dev/null
@@ -1,778 +0,0 @@
-use strict;
-use warnings;
-package LaTeX::ToUnicode;
-BEGIN {
- $LaTeX::ToUnicode::VERSION = '0.54';
-}
-#ABSTRACT: Convert LaTeX commands to Unicode (simplistically)
-
-require Exporter;
-our @ISA = qw(Exporter);
-our @EXPORT_OK = qw( convert debuglevel $endcw );
-
-use utf8;
-use Encode;
-use LaTeX::ToUnicode::Tables;
-
-# Terminating a control word (not symbol) the way TeX does: at the
-# boundary between a letter (lookbehind) and a nonletter (lookahead),
-# and then ignore any following whitespace.
-our $endcw = qr/(?<=[a-zA-Z])(?=[^a-zA-Z]|$)\s*/;
-
-# all we need for is debugging being on and off. And it's pretty random
-# what gets output.
-my $debug = 0;
-
-sub debuglevel { $debug = shift; }
-sub _debug {
- return unless $debug;
- # The backtrace info is split between caller(0) and caller(1), sigh.
- # We don't need the package name, it's included in $subr in practice.
- my (undef,$filename,$line,undef) = caller(0);
- my (undef,undef,undef,$subr) = caller(1);
- warn @_, " at $filename:$line ($subr)\n";
-}
-
-# The main conversion function.
-#
-sub convert {
- my ($string, %options) = @_;
- #warn debug_hash_as_string("starting with: $string", %options);
-
- # First, remove leading and trailing horizontal whitespace
- # on each line of the possibly-multiline string we're given.
- $string =~ s/^[ \t]*//m;
- $string =~ s/[ \t]*$//m;
-
- # For HTML output, must convert special characters that were in the
- # TeX text (&<>) to their entities to avoid misparsing. We want to
- # do this first, because conversion of the markup commands might
- # output HTML tags like <tt>, and we don't want to convert those <>.
- # Although &lt;tt&gt; works, better to keep the output HTML as
- # human-readable as we can.
- #
- if ($options{html}) {
- $string =~ s/([^\\]|^)&/$1&amp;/g;
- $string =~ s/</&lt;/g;
- $string =~ s/>/&gt;/g;
- }
-
- my $user_hook = $options{hook};
- if ($user_hook) {
- $string = &$user_hook($string, \%options);
- _debug("after user hook: $string");
- }
-
- # Convert general commands that take arguments, since (1) they might
- # insert TeX commands that need to be converted, and (2) because
- # their arguments could well contain constructs that will map to a
- # Perl string \x{nnnn} for Unicode character nnnn; those Perl braces
- # for the \x will confuse further parsing of the TeX.
- #
- $string = _convert_commands_with_arg($string);
- _debug("after commands with arg: $string");
-
- # Convert markups (\texttt, etc.); they have the same brace-parsing issue.
- $string = _convert_markups($string, \%options);
- _debug("after markups: $string");
-
- # And urls, a special case of commands with arguments.
- $string = _convert_urls($string, \%options);
- _debug("after urls: $string");
-
- $string = _convert_control_words($string);
- _debug("after control words: $string");
-
- $string = _convert_control_symbols($string);
- _debug("after control symbols: $string");
-
- $string = _convert_accents($string);
- $string = _convert_german($string) if $options{german};
- $string = _convert_symbols($string);
- $string = _convert_ligatures($string);
-
- # Let's handle ties here, after all the other conversions, since
- # they don't fit well with any of the tables.
- #
- # /~, or ~ at the beginning of a line, is probably part of a url or
- # path, not a tie. Otherwise, consider it a space, since a no-break
- # spot in TeX is most likely fine to break in text or HTML.
- #
- $string =~ s,([^/])~,$1 ,g;
-
- # Remove kerns. Clearly needs generalizing/sharpening to recognize
- # dimens better, and plenty of other commands could use it.
- #_debug("before kern: $string");
- my $dimen_re = qr/[-+]?[0-9., ]+[a-z][a-z]\s*/;
- $string =~ s!\\kern${endcw}${dimen_re}!!g;
-
- # What the heck, let's do \hfuzz and \vfuzz too. They come up pretty
- # often and practically the same thing (plus ignore optional =)..
- $string =~ s!\\[hv]fuzz${endcw}=?\s*${dimen_re}!!g;
-
- # After all the conversions, $string contains \x{....} constructs
- # (Perl Unicode characters) where translations have happened. Change
- # those to the desired output format. Thus we assume that the
- # Unicode \x{....}'s are not themselves involved in further
- # translations, which is, so far, true.
- #
- if (! $options{entities}) {
- # Convert our \x strings from Tables.pm to the binary characters.
-
- # As an extra-special case, we want to preserve the translation of
- # \{ and \} as 007[bd] entities even if the --entities option is
- # not give; otherwise they'd get eliminated like all other braces.
- # Use a temporary cs \xx to keep them marked, and don't use braces
- # to delimit the argument since they'll get deleted.
- $string =~ s/\\x\{(007[bd])\}/\\xx($1)/g;
-
- # Convert all other characters to characters.
- # Assume exactly four hex digits, since we wrote Tables.pm that way.
- $string =~ s/\\x\{(....)\}/ pack('U*', hex($1))/eg;
-
- } elsif ($options{entities}) {
- # Convert the XML special characters that appeared in the input,
- # e.g., from a TeX \&. Unless we're generating HTML output, in
- # which case they have already been converted.
- if (! $options{html}) {
- $string =~ s/&/&amp;/g;
- $string =~ s/</&lt;/g;
- $string =~ s/>/&gt;/g;
- }
-
- # Our values in Tables.pm are simple ASCII strings \x{....},
- # so we can replace them with hex entities with no trouble.
- # Fortunately TeX does not have a standard \x control sequence.
- $string =~ s/\\x\{(....)\}/&#x$1;/g;
-
- # The rest of the job is about binary Unicode characters in the
- # input. We want to transform them into entities also. As always
- # in Perl, there's more than one way to do it, and several are
- # described here, just for the fun of it.
- my $ret = "";
- #
- # decode_utf8 is described in https://perldoc.perl.org/Encode.
- # Without the decode_utf8, all of these methods output each byte
- # separately; apparently $string is a byte string at this point,
- # not a Unicode string. I don't know why that is.
- $ret = decode_utf8($string);
- #
- # Transform everything that's not printable ASCII or newline into
- # entities.
- $ret =~ s/([^ -~\n])/ sprintf("&#x%04x;", ord($1)) /eg;
- #
- # This method leaves control characters as literal; doesn't matter
- # for XML output, since control characters aren't allowed, but
- # let's use the regexp method anyway.
- #$ret = encode("ascii", decode_utf8($string), Encode::FB_XMLCREF);
- #
- # The nice_string function from perluniintro also works.
- #
- # This fails, just outputs numbers (that is, ord values):
- # foreach my $c (unpack("U*", $ret)) {
- #
- # Without the decode_utf8, outputs each byte separately.
- # With the decode_utf8, works, but the above seems cleaner.
- #foreach my $c (split(//, $ret)) {
- # if (ord($c) <= 31 || ord($c) >= 128) {
- # $ret .= sprintf("&#x%04x;", ord($c));
- # } else {
- # $ret .= $c;
- # }
- #}
- #
- $string = $ret; # assigned from above.
- }
-
- if ($string =~ /\\x\{/) {
- warn "LaTeX::ToUnicode::convert: untranslated \\x remains: $string\n";
- warn "LaTeX::ToUnicode::convert: please report as bug.\n";
- }
-
- # Drop all remaining braces.
- $string =~ s/[{}]//g;
-
- if (! $options{entities}) {
- # With all the other braces gone, now we can convert the preserved
- # brace entities from \{ and \} to actual braces.
- $string =~ s/\\xx\((007[bd])\)/ pack('U*', hex($1))/eg;
- }
-
- # Backslashes might remain. Don't remove them, as it makes for a
- # useful way to find unhandled commands.
-
- # leave newlines alone, but trim spaces and tabs.
- $string =~ s/^[ \t]+//s; # remove leading whitespace
- $string =~ s/[ \t]+$//s; # remove trailing whitespace
- $string =~ s/[ \t]+/ /gs; # collapse all remaining whitespace to one space
-
- $string;
-}
-
-# Convert commands that take a single braced argument. The table
-# defines text we're supposed to insert before and after the argument.
-# We let future processing handle conversion of both the inserted text
-# and the argument.
-#
-sub _convert_commands_with_arg {
- my $string = shift;
-
- foreach my $cmd ( keys %LaTeX::ToUnicode::Tables::ARGUMENT_COMMANDS ) {
- my $repl = $LaTeX::ToUnicode::Tables::ARGUMENT_COMMANDS{$cmd};
- my $lft = $repl->[0]; # ref to two-element list
- my $rht = $repl->[1];
- # \cmd{foo} -> LFT foo RHT
- $string =~ s/\\$cmd${endcw}\{(.*?)\}/$lft$1$rht/g;
- #warn "replaced arg $cmd, yielding $string\n";
- }
-
- $string;
-}
-
-# Convert url commands in STRING. This is a special case of commands
-# with arguments: \url{u} and \href{u}{desc text}. The HTML output
-# (generated if $OPTIONS{html} is set) is just too special to be handled
-# in a table; further, \href is the only two-argument command we are
-# currently handling.
-#
-sub _convert_urls {
- my ($string,$options) = @_;
-
- if ($options->{html}) {
- # HTML output.
- # \url{URL} -> <a href="URL">URL</a>
- $string =~ s,\\url$endcw\{([^}]*)\}
- ,<a href="$1">$1</a>,gx;
- #
- # \href{URL}{TEXT} -> <a href="URL">TEXT</a>
- $string =~ s,\\href$endcw\{([^}]*)\}\s*\{([^}]*)\}
- ,<a href="$1">$2</a>,gx;
-
- } else {
- # plain text output.
- # \url{URL} -> URL
- $string =~ s/\\url$endcw\{([^}]*)\}/$1/g;
- #
- # \href{URL}{TEXT} -> TEXT (URL)
- # but, as a special case, if URL ends with TEXT, just output URL,
- # as in:
- # \href{https://doi.org/10/fjzzc8}{10/fjzzc8}
- # ->
- # https://doi.org/10/fjzzc8
- #
- # Yet more specialness: the TEXT might have extra braces, as in
- # \href{https://doi.org/10/fjzzc8}{{10/fjzzc8}}
- # left over from previous markup commands (\path) which got
- # removed. We want to accept and ignore such extra braces,
- # hence the \{+ ... \}+ in recognizing TEXT.
- #
-#warn "txt url: starting with $string\n";
- if ($string =~ m/\\href$endcw\{([^}]*)\}\s*\{+([^}]*)\}+/) {
- my $url = $1;
- my $text = $2;
-#warn " url: $url\n";
-#warn " text: $text\n";
- my $repl = ($url =~ m!$text$!) ? $url : "$text ($url)";
-#warn " repl: $repl\n";
- $string =~ s/\\href$endcw\{([^}]*)\}\s*\{+([^}]*)\}+/$repl/;
-#warn " str: $string\n";
- }
- }
-
- $string;
-}
-
-# Convert control words (not symbols), that is, a backslash and an
-# alphabetic sequence of characters terminated by a non-alphabetic
-# character. Following whitespace is ignored.
-#
-sub _convert_control_words {
- my $string = shift;
-
- foreach my $command ( keys %LaTeX::ToUnicode::Tables::CONTROL_WORDS ) {
- my $repl = $LaTeX::ToUnicode::Tables::CONTROL_WORDS{$command};
- # replace {\CMD}, whitespace ignored after \CMD.
- $string =~ s/\{\\$command$endcw\}/$repl/g;
-
- # replace \CMD, preceded by not-consumed non-backslash.
- $string =~ s/(?<=[^\\])\\$command$endcw/$repl/g;
-
- # replace \CMD at beginning of whole string, which otherwise
- # wouldn't be matched. Two separate regexps to avoid
- # variable-length lookbehind.
- $string =~ s/^\\$command$endcw/$repl/g;
- }
-
- $string;
-}
-
-# Convert control symbols, other than accents. Much simpler than
-# control words, since are self-delimiting, don't take arguments, and
-# don't consume any following text.
-#
-sub _convert_control_symbols {
- my $string = shift;
-
- foreach my $symbol ( keys %LaTeX::ToUnicode::Tables::CONTROL_SYMBOLS ) {
- my $repl = $LaTeX::ToUnicode::Tables::CONTROL_SYMBOLS{$symbol};
-
- # because these are not alphabetic, we can quotemeta them,
- # and we need to because "\" is one of the symbols.
- my $rx = quotemeta($symbol);
-
- # the preceding character must not be a backslash, else "\\ "
- # could have the "\ " seen first as a control space, leaving
- # a spurious \ behind. Don't consume the preceding.
- # Or it could be at the beginning of a line.
- #
- $string =~ s/(^|(?<=[^\\]))\\$rx/$repl/g;
- #warn "after sym $symbol (\\$rx -> $repl), have: $string\n";
- }
-
- $string;
-}
-
-# Convert accents.
-#
-sub _convert_accents {
- my $string = shift;
-
- # first the non-alphabetic accent commands, like \".
- my %tbl = %LaTeX::ToUnicode::Tables::ACCENT_SYMBOLS;
- $string =~ s/(\{\\(.)\s*\{(\\?\w{1,2})\}\})/$tbl{$2}{$3} || $1/eg; #{\"{a}}
- $string =~ s/(\{\\(.)\s*(\\?\w{1,2})\})/ $tbl{$2}{$3} || $1/eg; # {\"a}
- $string =~ s/(\\(.)\s*(\\?\w{1,1}))/ $tbl{$2}{$3} || $1/eg; # \"a
- $string =~ s/(\\(.)\s*\{(\\?\w{1,2})\})/ $tbl{$2}{$3} || $1/eg; # \"{a}
-
- # second the alphabetic commands, like \c. They have to be handled
- # differently because \cc is not \c{c}! The only difference in the
- # regular expressions is using $endcw instead of just \s*.
- #
- %tbl = %LaTeX::ToUnicode::Tables::ACCENT_LETTERS;
- $string =~ s/(\{\\(.)$endcw\{(\\?\w{1,2})\}\})/$tbl{$2}{$3} || $1/eg; #{\"{a}}
- $string =~ s/(\{\\(.)$endcw(\\?\w{1,2})\})/ $tbl{$2}{$3} || $1/eg; # {\"a}
- $string =~ s/(\\(.)$endcw(\\?\w{1,1}))/ $tbl{$2}{$3} || $1/eg; # \"a
- $string =~ s/(\\(.)$endcw\{(\\?\w{1,2})\})/ $tbl{$2}{$3} || $1/eg; # \"{a}
-
-
- # The argument is just one \w character for the \"a case, not two,
- # because otherwise we might consume a following character that is
- # not part of the accent, e.g., a backslash (\"a\'e).
- #
- # Others can be two because of the \t tie-after accent. Even {\t oo} is ok.
- #
- # Allow whitespace after the \CMD in all cases, e.g., "\c c". Even
- # for the control symbols, it turns out spaces are ignored there
- # (as in \" o), unlike the usual syntax.
- #
- # Some non-word constituents would work, but in practice we hope
- # everyone just uses letters.
-
- $string;
-}
-
-# For the [n]german package.
-sub _convert_german {
- my $string = shift;
-
- foreach my $symbol ( keys %LaTeX::ToUnicode::Tables::GERMAN ) {
- $string =~ s/\Q$symbol\E/$LaTeX::ToUnicode::Tables::GERMAN{$symbol}/g;
- }
- $string;
-}
-
-# Control words that produce printed symbols (and letters in languages
-# other than English), that is.
-#
-sub _convert_symbols {
- my $string = shift;
-
- foreach my $symbol ( keys %LaTeX::ToUnicode::Tables::SYMBOLS ) {
- my $repl = $LaTeX::ToUnicode::Tables::SYMBOLS{$symbol};
- # preceded by a (non-consumed) non-backslash,
- # usual termination for a control word.
- # These commands don't take arguments.
- $string =~ s/(?<=[^\\])\\$symbol$endcw/$repl/g;
-
- # or the beginning of the whole string:
- $string =~ s/^\\$symbol$endcw/$repl/g;
- }
- $string;
-}
-
-# Special character sequences, not \commands. They aren't all
-# technically ligatures, but no matter.
-#
-sub _convert_ligatures {
- my $string = shift;
-
- # have to convert these in order specified.
- my @ligs = @LaTeX::ToUnicode::Tables::LIGATURES;
- for (my $i = 0; $i < @ligs; $i+=2) {
- my $in = $ligs[$i];
- my $out = $ligs[$i+1];
- $string =~ s/\Q$in\E/$out/g;
- }
- $string;
-}
-
-#
-# Convert LaTeX markup commands in STRING like \textbf{...} and
-# {\bfshape ...} and {\bf ...}.
-#
-# If we're aiming for plain text output, they are just cleared away (the
-# braces are not removed).
-#
-# If we're generating HTML output ("html" key is set in $OPTIONS hash
-# ref), we use the value in the hash, so that \textbf{foo} becomes
-# <b>foo</b>. Nested markup doesn't work.
-#
-sub _convert_markups {
- my ($string, $options) = @_;
-
- # HTML is different.
- return _convert_markups_html($string) if $options->{html};
-
- # Not HTML, so here we'll "convert" to plain text by removing the
- # markup commands.
-
- # we can do all the markup commands at once.
- my $markups = join('|', keys %LaTeX::ToUnicode::Tables::MARKUPS);
-
- # Remove \textMARKUP{...}, leaving just the {...}
- $string =~ s/\\text($markups)$endcw//g;
-
- # Similarly remove \MARKUPshape, plus remove \upshape.
- $string =~ s/\\($markups|up)shape$endcw//g;
-
- # Remove braces and \command in: {... \MARKUP ...}
- $string =~ s/(\{[^{}]+)\\(?:$markups)$endcw([^{}]+\})/$1$2/g;
-
- # Remove braces and \command in: {\MARKUP ...}
- $string =~ s/\{\\(?:$markups)$endcw([^{}]*)\}/$1/g;
-
- # Remove: {\MARKUP
- # Although this will leave unmatched } chars behind, there's no
- # alternative without full parsing, since the bib entry will often
- # look like: {\em {The TeX{}book}}. Also might, in principle, be
- # at the end of a line.
- $string =~ s/\{\\(?:$markups)$endcw//g;
-
- # Ultimately we remove all braces in ltx2crossrefxml SanitizeText fns,
- # so the unmatched braces don't matter ... that code should be moved.
-
- $string;
-}
-
-# Convert \markup in STRING to html. We can't always figure out where to
-# put the end tag, but we always put it somewhere. We don't even attempt
-# to handle nested markup.
-#
-sub _convert_markups_html {
- my ($string) = @_;
-
- my %MARKUPS = %LaTeX::ToUnicode::Tables::MARKUPS;
- # have to consider each markup \command separately.
- for my $markup (keys %MARKUPS) {
- my $hcmd = $MARKUPS{$markup}; # some TeX commands don't translate
- my $tag = $hcmd ? "<$hcmd>" : "";
- my $end_tag = $hcmd ? "</$hcmd>" : "";
-
- # The easy one: \textMARKUP{...}
- $string =~ s/\\text$markup$endcw\{(.*?)\}/$tag$1$end_tag/g;
-
- # {x\MARKUP(shape) y} -> x<mk>y</mk> (leave out braces)
- $string =~ s/\{([^{}]+)\\$markup(shape)?$endcw([^{}]+)\}
- /$1$tag$3$end_tag/gx;
-
- # {\MARKUP(shape) y} -> <mk>y</mk>. Same as previous but without
- # the x part. Could do it in one regex but this seems clearer.
- $string =~ s/\{\\$markup(shape)?$endcw([^{}]+)\}
- /$tag$2$end_tag/gx;
-
- # for {\MARKUP(shape) ... with no matching brace, we don't know
- # where to put the end tag, so seems best to do nothing.
- }
-
- $string;
-}
-
-
-##############################################################
-# debug_hash_as_string($LABEL, HASH)
-#
-# Return LABEL followed by HASH elements, followed by a newline, as a
-# single string. If HASH is a reference, it is followed (but no recursive
-# derefencing).
-###############################################################
-sub debug_hash_as_string {
- my ($label) = shift;
- my (%hash) = (ref $_[0] && $_[0] =~ /.*HASH.*/) ? %{$_[0]} : @_;
-
- my $str = "$label: {";
- my @items = ();
- for my $key (sort keys %hash) {
- my $val = $hash{$key};
- $val = ".undef" if ! defined $val;
- $key =~ s/\n/\\n/g;
- $val =~ s/\n/\\n/g;
- push (@items, "$key:$val");
- }
- $str .= join (",", @items);
- $str .= "}";
-
- return "$str\n";
-}
-
-1;
-
-__END__
-=pod
-
-=encoding UTF-8
-
-=head1 NAME
-
-LaTeX::ToUnicode - Convert LaTeX commands to Unicode
-
-=head1 VERSION
-
-version 0.54
-
-=head1 SYNOPSIS
-
- use LaTeX::ToUnicode qw( convert debuglevel $endcw );
-
- # simple examples:
- convert( '{\"a}' ) eq 'ä'; # true
- convert( '{\"a}', entities=>1 ) eq '&#00EF;'; # true
- convert( '"a', german=>1 ) eq 'ä'; # true, `german' package syntax
- convert( '"a', ) eq '"a'; # false, not enabled by default
-
- # more generally:
- my $latexstr;
- my $unistr = convert($latexstr); # get literal (binary) Unicode characters
-
- my $entstr = convert($latexstr, entities=>1); # get &#xUUUU;
-
- my $htmstr = convert($latexstr, entities=>1, html=>1); # also html markup
-
- my $unistr = convert($latexstr, hook=>\&my_hook); # user-defined hook
-
- # if nonzero, dumps various info; perhaps other levels in the future.
- LaTeX::ToUnicode::debuglevel($verbose);
-
- # regexp for terminating TeX control words, e.g., in hooks.
- my $endcw = $LaTeX::ToUnicode::endcw;
- $string =~ s/\\newline$endcw/ /g; # translate \newline to space
-
-=head1 DESCRIPTION
-
-This module provides a method to convert LaTeX markups for accents etc.
-into their Unicode equivalents. It translates some commands for special
-characters or accents into their Unicode (or HTML) equivalents and
-removes formatting commands. It is not at all bulletproof or complete.
-
-This module is intended to convert fragments of LaTeX source, such as
-bibliography entries and abstracts, into plain text (or, optionally,
-simplistic HTML). It is not a document conversion system. Math, tables,
-figures, sectioning, etc., are not handled in any way, and mostly left
-in their TeX form in the output. The translations assume standard LaTeX
-meanings for characters and control sequences; macros in the input are
-not considered.
-
-The aim for all the output is utter simplicity and minimalism, not
-faithful translation. For example, although Unicode has a code point for
-a thin space, the LaTeX C<\thinspace> (etc.) command is translated to
-the empty string; such spacing refinements desirable in the TeX output
-are, in our experience, generally not desired in the HTML output from
-this tool.
-
-As another example, TeX C<%> comments are not removed, even on lines by
-themselves, because they may be inside verbatim blocks, and we don't
-attempt to keep any such context. In practice, TeX comments are rare in
-the text fragments intended to be handled, so removing them in advance
-has not been a great burden.
-
-As another example, LaTeX ties, C<~> characters, are replaced with
-normal spaces (exception: unless they follow a C</> character or at the
-beginning of a line, when they're assumed to be part of a url or a
-pathname), rather than a no-break space character, because in our
-experience most ties intended for the TeX output would just cause
-trouble in plain text or HTML.
-
-Regarding normal whitespace: all leading and trailing horizontal
-whitespace (that is, SPC and TAB) is removed. All internal horizontal
-whitespace sequences are collapsed to a single space.
-
-After the conversions, all brace characters (C<{}>) are simply removed
-from the returned string. This turns out to be a significant convenience
-in practice, since many LaTeX commands which take arguments don't need
-to do anything for our purposes except output the argument.
-
-On the other hand, backslashes are not removed. This is so the caller
-can check for C<\\> and thus discover untranslated commands. Of course
-there are many other constructs that might not be translated, or
-translated wrongly. There is no escaping the need to carefully look at
-the output.
-
-Suggestions and bug reports are welcome for practical needs; we know
-full well that there are hundreds of commands not handled that could be.
-Virtually all the behavior mentioned here would be easily made
-customizable, if there is a need to do so.
-
-=head1 FUNCTIONS
-
-=head2 convert( $latex_string, %options )
-
-Convert the text in C<$latex_string> into a plain(er) Unicode string.
-Escape sequences for accented and special characters (e.g., C<\i>,
-C<\"a>, ...) are converted. A few basic formatting commands (e.g.,
-C<{\it ...}>) are removed. See the L<LaTeX::ToUnicode::Tables> submodule
-for the full conversion tables.
-
-These keys are recognized in C<%options>:
-
-=over
-
-=item C<entities>
-
-Output C<&#xUUUU;> entities (valid in XML); in this case, also convert
-the E<lt>, E<gt>, C<&> metacharacters to entities. Recognized non-ASCII
-Unicode characters in the original input are also converted to entities,
-not only the translations from TeX commands.
-
-The default is to output literal (binary) Unicode characters, and
-not change any metacharacters.
-
-=item C<german>
-
-If this option is set, the commands introduced by the package `german'
-(e.g. C<"a> eq C<ä>, note the missing backslash) are also
-handled.
-
-=item C<html>
-
-If this option is set, the output is simplistic html rather than plain
-text. This affects only a few things: S<1) the> output of urls from
-C<\url> and C<\href>; S<2) the> output of markup commands like
-C<\textbf> (but nested markup commands don't work); S<3) two> other
-random commands, C<\enquote> and C<\path>, because they are needed.
-
-=item C<hook>
-
-The value must be a function that takes two arguments and returns a
-string. The first argument is the incoming string (may be multiple
-lines), and the second argument is a hash reference of options, exactly
-what was passed to this C<convert> function. Thus the hook can detect
-whether html is needed.
-
-The hook is called (almost) right away, before any of the other
-conversions have taken place. That way the hook can make use of the
-predefined conversions instead of repeating them. The only changes made
-to the input string before the hook is called are trivial: leading and
-trailing whitespace (space and tab) on each line are removed, and, for
-HTML output, incoming ampersand, less-than, and greater-than characters
-are replaced with their entities.
-
-Any substitutions that result in Unicode code points must use
-C<\\x{nnnn}> on the right hand side: that's two backslashes and a
-four-digit hex number.
-
-As an example, here is a skeleton of the hook function for TUGboat:
-
- sub LaTeX_ToUnicode_convert_hook {
- my ($string,$options) = @_;
-
- my $endcw = $LaTeX::ToUnicode::endcw;
- die "no endcw regexp in LaTeX::ToUnicode??" if ! $endcw;
-
- ...
- $string =~ s/\\newline$endcw/ /g;
-
- # TUB's \acro{} takes an argument, but we do nothing with it.
- # The braces will be removed by convert().
- $string =~ s/\\acro$endcw//g;
- ...
- $string =~ s/\\CTAN$endcw/CTAN/g;
- $string =~ s/\\Dash$endcw/\\x{2014}/g; # em dash; replacement is string
- ...
-
- # ignore \begin{abstract} and \end{abstract} commands.
- $string =~ s,\\(begin|end)$endcw\{abstract\}\s*,,g;
-
- # Output for our url abbreviations, and other commands, depends on
- # whether we're generating plain text or HTML.
- if ($options->{html}) {
- # HTML.
- # \tbsurl{URLBASE} -> <a href="https://URLBASE">URLBASE</a>
- $string =~ s,\\tbsurl$endcw\{([^}]*)\}
- ,<a href="https://$1">$1</a>,gx;
- ...
- # varepsilon, and no line break at hyphen.
- $string =~ s,\\eTeX$endcw,\\x{03B5}<nobr>-</nobr>TeX,g;
-
- } else {
- # for plain text, we can just prepend the protocol://.
- $string =~ s,\\tbsurl$endcw,https://,g;
- ...
- $string =~ s,\\eTeX$endcw,\\x{03B5}-TeX,g;
- }
- ...
- return $string;
- }
-
-As shown here for C<\eTeX> (an abbreviation macro defined in the
-TUGboat style files), if markup is desired in the output, the
-substitutions must be different for HTML and plain text. Otherwise, the
-desired HTML markup is transliterated as if it were plain text. Or else
-the translations must be extended so that TeX markup can be used on the
-rhs to be replaced with the desired HTML (C<&lt;nobr&gt;> in this case).
-
-For the full definition (and plenty of additional information),
-see the file C<ltx2crossrefxml-tugboat.cfg> in the TUGboat source
-repository at
-<https://github.com/TeXUsersGroup/tugboat/tree/trunk/capsules/crossref>.
-
-The hook function is specified in the C<convert()> call like this:
-
- LaTeX::ToUnicode::convert(..., { hook => \&LaTeX_ToUnicode_convert_hook })
-
-=back
-
-=head2 debuglevel( $level )
-
-Output debugging information if C<$level> is nonzero.
-
-=head2 $endcw
-
-A predefined regexp for terminating TeX control words (not control
-symbols!). Can be used in, for example, hook functions:
-
- my $endcw = $LaTeX::ToUnicode::endcw;
- $string =~ s/\\newline$endcw/ /g; # translate \newline to space
-
-It's defined as follows:
-
- our $endcw = qr/(?<=[a-zA-Z])(?=[^a-zA-Z]|$)\s*/;
-
-That is, look behind for an alphabetic character, then look ahead for a
-non-alphabetic character (or end of line), then consume whitespace.
-Fingers crossed.
-
-=head1 AUTHOR
-
-Gerhard Gossen <gerhard.gossen@googlemail.com>,
-Boris Veytsman <boris@varphi.com>,
-Karl Berry <karl@freefriends.org>
-
-L<https://github.com/borisveytsman/bibtexperllibs>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 2010-2023 Gerhard Gossen, Boris Veytsman, Karl Berry
-
-This is free software; you can redistribute it and/or modify it under
-the same terms as the Perl5 programming language system itself.
-
-=cut
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode/Tables.pm b/support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode/Tables.pm
deleted file mode 100644
index dd02926e03..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode/Tables.pm
+++ /dev/null
@@ -1,726 +0,0 @@
-package LaTeX::ToUnicode::Tables;
-BEGIN {
- $LaTeX::ToUnicode::Tables::VERSION = '0.54';
-}
-use strict;
-use warnings;
-#ABSTRACT: Character tables for LaTeX::ToUnicode
-
-use utf8; # just for the german support
-
-# Technically not all of these are ligatures, but close enough.
-# Order is important, so has to be a list, not a hash.
-#
-our @LIGATURES = (
- "---" => '\x{2014}', # em dash
- "--" => '\x{2013}', # en dash
- "!`" => '\x{00A1}', # inverted exclam
- "?`" => '\x{00A1}', # inverted question
- "``" => '\x{201c}', # left double
- "''" => '\x{201d}', # right double
- "`" => '\x{2018}', # left single
- "'" => '\x{2019}', # right single
-);
-# test text: em---dash, en--dash, exc!`am, quest?`ion, ``ld, rd'', `ls, rs'.
-#
-# Some additional ligatures supported in T1 encoding, but we won't (from
-# tex-text.map):
-# U+002C U+002C <> U+201E ; ,, -> DOUBLE LOW-9 QUOTATION MARK
-# U+003C U+003C <> U+00AB ; << -> LEFT POINTING GUILLEMET
-# U+003E U+003E <> U+00BB ; >> -> RIGHT POINTING GUILLEMET
-
-# for {\MARKUP(shape) ...} and \textMARKUP{...}; although not all
-# command names are defined in LaTeX for all markups, we translate them
-# anyway. Also, LaTeX has more font axes not included here: md, ulc, sw,
-# ssc, etc. See ltfntcmd.dtx and ltfssaxes.dtx if we ever want to try
-# for completeness.
-#
-our %MARKUPS = (
- 'bf' => 'b',
- 'cal' => '',
- 'em' => 'em',
- 'it' => 'i',
- 'rm' => '',
- 'sc' => '', # qqq should uppercasify
- 'sf' => '',
- 'sl' => 'i',
- 'small' => '',
- 'subscript' => 'sub',
- 'superscript' => 'sup',
- 'tt' => 'tt',
-);
-
-# More commands taking arguments that we want to handle.
-#
-our %ARGUMENT_COMMANDS = (
- 'emph' => ['\textem{', '}'], # \textem doesn't exist, but we handle it
- 'enquote' => ["`", "'"],
- 'path' => ['\texttt{', '}'], # ugh, might not be a braced argument
-);
-
-# Non-alphabetic \COMMANDs, other than accents and special cases.
-#
-our %CONTROL_SYMBOLS = (
- ' ' => ' ', # control space
- "\t" => ' ', # control space
- "\n" => '\x{0020}', # control space; use entity to avoid being trimmed
- '!' => '', # negative thin space
- # " umlaut
- '#' => '#', # sharp sign
- '$' => '$', # dollar sign
- '%' => '%', # percent sign
- '&' => '\x{0026}', # ampersand, entity to avoid html conflict
- # ' acute accent
- '(' => '', # start inline math
- ')' => '', # end inline math
- '*' => '', # discretionary multiplication
- '+' => '', # tabbing: tab stop to right
- ',' => '', # thin space
- '-' => '', # discretionary hyphenation
- # . overdot accent
- '/' => '', # italic correction
- # 0..9 undefined
- ':' => '', # medium space
- ';' => ' ', # thick space
- '<' => '', # tabbing: text to left of margin
- # = macron accent
- '>' => '', # tabbing: next tab stop
- # ? undefined
- '@' => '#', # end of sentence
- # A..Z control words, not symbols
- '[' => '', # start display math
- '\\' => ' ', # line break
- ']' => '', # end display math
- # ^ circumflex accent
- '_' => '_', # underscore
- # ` grave accent
- # a..z control words, not symbols
- '{' => '\x{007b}', # lbrace
- '|' => '\x{2225}', # parallel
- '}' => '\x{007d}', # rbrace
- # ~ tilde accent
-);
-
-# Alphabetic \COMMANDs that map to nothing. This is simply
-# interpolated into %CONTROL_WORDS (next), not used directly, so we
-# redundantly specify the '' on every line.
-#
-our %CONTROL_WORDS_EMPTY = (
- 'begingroup' => '',
- 'bgroup' => '',
- 'checkcomma' => '',
- #'cite' => '', # keep \cite undefined since it needs manual work
- 'clearpage' => '',
- 'doi' => '',
- 'egroup' => '',
- 'endgroup' => '',
- 'ensuremath' => '',
- 'hbox' => '',
- 'ignorespaces' => '',
- 'mbox' => '',
- 'medspace' => '',
- 'negmedspace' => '',
- 'negthickspace' => '',
- 'negthinspace' => '',
- 'newblock' => '',
- 'newpage' => '',
- 'noindent' => '',
- 'nolinkurl' => '',
- 'oldstylenums' => '',
- 'pagebreak' => '',
- 'protect' => '',
- 'raggedright' => '',
- 'relax' => '',
- 'thinspace' => '',
- 'unskip' => '',
- 'urlprefix' => '',
-);
-
-# Alphabetic commands, that expand to nothing (above) and to
-# something (below).
-#
-our %CONTROL_WORDS = (
- %CONTROL_WORDS_EMPTY,
- 'BibLaTeX' => 'BibLaTeX',
- 'BibTeX' => 'BibTeX',
- 'LaTeX' => 'LaTeX',
- 'LuaLaTeX' => 'LuaLaTeX',
- 'LuaTeX' => 'LuaTeX',
- 'MF' => 'Metafont',
- 'MP' => 'MetaPost',
- 'Omega' => '\x{03A9}',
- 'TeX' => 'TeX',
- 'XeLaTeX' => 'XeLaTeX',
- 'XeTeX' => 'XeTeX',
- 'bullet' => '\x{2022}',
- 'dag' => '\x{2020}',
- 'ddag' => '\x{2021}',
- 'dots' => '\x{2026}',
- 'epsilon' => '\x{03F5}',
- 'hookrightarrow' => '\x{2194}',
- 'ldots' => '\x{2026}',
- 'log' => 'log',
- 'omega' => '\x{03C9}',
- 'par' => "\n\n",
- 'qquad' => ' ', # 2em space
- 'quad' => ' ', # em space
- 'textbackslash' => '\x{005C}', # entities so \ in output indicates
- # untranslated TeX source
- 'textbraceleft' => '\x{007B}', # entities so our bare-brace removal
- 'textbraceright' => '\x{007D}', # skips them
- 'textgreater' => '\x{003E}',
- 'textless' => '\x{003C}',
- 'textquotedbl' => '"',
- 'thickspace' => ' ',
- 'varepsilon' => '\x{03B5}',
-);
-
-# Control words (not symbols) that generate various non-English
-# letters and symbols. Lots more could be added.
-#
-our %SYMBOLS = ( # Table 3.2 in Lamport, plus more
- 'AA' => '\x{00C5}', # A with ring
- 'aa' => '\x{00E5}',
- 'AE' => '\x{00C6}', # AE
- 'ae' => '\x{00E6}',
- 'DH' => '\x{00D0}', # ETH
- 'dh' => '\x{00F0}',
- 'DJ' => '\x{0110}', # D with stroke
- 'dj' => '\x{0111}',
- 'i' => '\x{0131}', # small dotless i
- 'L' => '\x{0141}', # L with stroke
- 'l' => '\x{0142}',
- 'NG' => '\x{014A}', # ENG
- 'ng' => '\x{014B}',
- 'OE' => '\x{0152}', # OE
- 'oe' => '\x{0153}',
- 'O' => '\x{00D8}', # O with stroke
- 'o' => '\x{00F8}',
- 'SS' => 'SS', # lately also U+1E9E, but SS seems good enough
- 'ss' => '\x{00DF}',
- 'TH' => '\x{00DE}', # THORN
- 'textordfeminine' => '\x{00AA}',
- 'textordmasculine' => '\x{00BA}',
- 'textregistered' => '\x{00AE}',
- 'th' => '\x{00FE}',
- 'TM' => '\x{2122}', # trade mark sign
-);
-
-# Accent commands that are not alphabetic.
-#
-our %ACCENT_SYMBOLS = (
- "\"" => { # with diaresis
- A => '\x{00C4}',
- E => '\x{00CB}',
- H => '\x{1E26}',
- I => '\x{00CF}',
- O => '\x{00D6}',
- U => '\x{00DC}',
- W => '\x{1E84}',
- X => '\x{1E8c}',
- Y => '\x{0178}',
- "\\I" => '\x{00CF}',
- "\\i" => '\x{00EF}',
- a => '\x{00E4}',
- e => '\x{00EB}',
- h => '\x{1E27}',
- i => '\x{00EF}',
- o => '\x{00F6}',
- t => '\x{1E97}',
- u => '\x{00FC}',
- w => '\x{1E85}',
- x => '\x{1E8d}',
- y => '\x{00FF}',
- },
- "'" => { # with acute
- A => '\x{00C1}',
- AE => '\x{01FC}',
- C => '\x{0106}',
- E => '\x{00C9}',
- G => '\x{01F4}',
- I => '\x{00CD}',
- K => '\x{1E30}',
- L => '\x{0139}',
- M => '\x{1E3E}',
- N => '\x{0143}',
- O => '\x{00D3}',
- P => '\x{1E54}',
- R => '\x{0154}',
- S => '\x{015A}',
- U => '\x{00DA}',
- W => '\x{1E82}',
- Y => '\x{00DD}',
- Z => '\x{0179}',
- "\\I" => '\x{00CD}',
- "\\i" => '\x{00ED}',
- a => '\x{00E1}',
- ae => '\x{01FD}',
- c => '\x{0107}',
- e => '\x{00E9}',
- g => '\x{01F5}',
- i => '\x{00ED}',
- k => '\x{1E31}',
- l => '\x{013A}',
- m => '\x{1E3f}',
- n => '\x{0144}',
- o => '\x{00F3}',
- p => '\x{1E55}',
- r => '\x{0155}',
- s => '\x{015B}',
- u => '\x{00FA}',
- w => '\x{1E83}',
- y => '\x{00FD}',
- z => '\x{017A}',
- },
- "^" => { # with circumflex
- A => '\x{00C2}',
- C => '\x{0108}',
- E => '\x{00CA}',
- G => '\x{011C}',
- H => '\x{0124}',
- I => '\x{00CE}',
- J => '\x{0134}',
- O => '\x{00D4}',
- R => 'R\x{0302}',
- S => '\x{015C}',
- U => '\x{00DB}',
- W => '\x{0174}',
- Y => '\x{0176}',
- Z => '\x{1E90}',
- "\\I" => '\x{00CE}',
- "\\J" => '\x{0134}',
- "\\i" => '\x{00EE}',
- "\\j" => '\x{0135}',
- a => '\x{00E2}',
- c => '\x{0109}',
- e => '\x{00EA}',
- g => '\x{011D}',
- h => '\x{0125}',
- i => '\x{00EE}',
- j => '\x{0135}',
- o => '\x{00F4}',
- s => '\x{015D}',
- u => '\x{00FB}',
- w => '\x{0175}',
- y => '\x{0177}',
- z => '\x{1E91}',
- },
- "`" => { # with grave
- A => '\x{00C0}',
- E => '\x{00C8}',
- I => '\x{00CC}',
- N => '\x{01F8}',
- O => '\x{00D2}',
- U => '\x{00D9}',
- W => '\x{1E80}',
- Y => '\x{1Ef2}',
- "\\I" => '\x{00CC}',
- "\\i" => '\x{00EC}',
- a => '\x{00E0}',
- e => '\x{00E8}',
- i => '\x{00EC}',
- n => '\x{01F9}',
- o => '\x{00F2}',
- u => '\x{00F9}',
- w => '\x{1E81}',
- y => '\x{1EF3}',
- },
- "." => { # with dot above
- A => '\x{0226}',
- B => '\x{1E02}',
- C => '\x{010A}',
- D => '\x{1E0A}',
- E => '\x{0116}',
- F => '\x{1E1E}',
- G => '\x{0120}',
- H => '\x{1E22}',
- I => '\x{0130}',
- M => '\x{1E40}',
- N => '\x{1E44}',
- O => '\x{022E}',
- P => '\x{1E56}',
- R => '\x{1E58}',
- S => '\x{1E60}',
- T => '\x{1E6a}',
- W => '\x{1E86}',
- X => '\x{1E8A}',
- Y => '\x{1E8E}',
- Z => '\x{017B}',
- "\\I" => '\x{0130}',
- a => '\x{0227}',
- b => '\x{1E03}',
- c => '\x{010B}',
- d => '\x{1E0B}',
- e => '\x{0117}',
- f => '\x{1e1f}',
- g => '\x{0121}',
- h => '\x{1E23}',
- m => '\x{1E41}',
- n => '\x{1E45}',
- o => '\x{022F}',
- p => '\x{1E57}',
- r => '\x{1E59}',
- s => '\x{1E61}',
- t => '\x{1E6b}',
- w => '\x{1E87}',
- x => '\x{1E8b}',
- y => '\x{1E8f}',
- z => '\x{017C}',
- },
- '=' => { # with macron
- A => '\x{0100}',
- AE => '\x{01E2}',
- E => '\x{0112}',
- G => '\x{1E20}',
- I => '\x{012A}',
- O => '\x{014C}',
- U => '\x{016A}',
- Y => '\x{0232}',
- "\\I" => '\x{012A}',
- "\\i" => '\x{012B}',
- a => '\x{0101}',
- ae => '\x{01E3}',
- e => '\x{0113}',
- g => '\x{1E21}',
- i => '\x{012B}',
- o => '\x{014D}',
- u => '\x{016B}',
- y => '\x{0233}',
- },
- "~" => { # with tilde
- A => '\x{00C3}',
- E => '\x{1EBC}',
- I => '\x{0128}',
- N => '\x{00D1}',
- O => '\x{00D5}',
- U => '\x{0168}',
- V => '\x{1E7C}',
- Y => '\x{1EF8}',
- "\\I" => '\x{0128}',
- "\\i" => '\x{0129}',
- a => '\x{00E3}',
- e => '\x{1EBD}',
- i => '\x{0129}',
- n => '\x{00F1}',
- o => '\x{00F5}',
- u => '\x{0169}',
- v => '\x{1E7D}',
- y => '\x{1EF9}',
- },
-);
-
-# Accent commands that are alphabetic.
-#
-our %ACCENT_LETTERS = (
- "H" => { # with double acute
- O => '\x{0150}',
- U => '\x{0170}',
- o => '\x{0151}',
- u => '\x{0171}',
- },
- "c" => { # with cedilla
- C => '\x{00C7}',
- D => '\x{1E10}',
- E => '\x{0228}',
- G => '\x{0122}',
- H => '\x{1E28}',
- K => '\x{0136}',
- L => '\x{013B}',
- N => '\x{0145}',
- R => '\x{0156}',
- S => '\x{015E}',
- T => '\x{0162}',
- c => '\x{00E7}',
- d => '\x{1E11}',
- e => '\x{0229}',
- g => '\x{0123}',
- h => '\x{1E29}',
- k => '\x{0137}',
- l => '\x{013C}',
- n => '\x{0146}',
- r => '\x{0157}',
- s => '\x{015F}',
- t => '\x{0163}',
- },
- "d" => { # with dot below
- A => '\x{1EA0}',
- B => '\x{1E04}',
- D => '\x{1E0C}',
- E => '\x{1EB8}',
- H => '\x{1E24}',
- I => '\x{1ECA}',
- K => '\x{1E32}',
- L => '\x{1E36}',
- M => '\x{1E42}',
- N => '\x{1E46}',
- O => '\x{1ECC}',
- R => '\x{1E5A}',
- S => '\x{1E62}',
- T => '\x{1E6C}',
- U => '\x{1EE4}',
- V => '\x{1E7E}',
- W => '\x{1E88}',
- Y => '\x{1Ef4}',
- Z => '\x{1E92}',
- "\\I" => '\x{1ECA}',
- "\\i" => '\x{1ECB}',
- a => '\x{1EA1}',
- b => '\x{1E05}',
- d => '\x{1E0D}',
- e => '\x{1EB9}',
- h => '\x{1E25}',
- i => '\x{1ECB}',
- k => '\x{1E33}',
- l => '\x{1E37}',
- m => '\x{1E43}',
- n => '\x{1E47}',
- o => '\x{1ECD}',
- r => '\x{1E5b}',
- s => '\x{1E63}',
- t => '\x{1E6D}',
- u => '\x{1EE5}',
- v => '\x{1E7F}',
- w => '\x{1E89}',
- y => '\x{1EF5}',
- z => '\x{1E93}',
- },
- "h" => { # with hook above
- A => '\x{1EA2}',
- E => '\x{1EBA}',
- I => '\x{1EC8}',
- O => '\x{1ECe}',
- U => '\x{1EE6}',
- Y => '\x{1EF6}',
- "\\I" => '\x{1EC8}',
- "\\i" => '\x{1EC9}',
- a => '\x{1EA3}',
- e => '\x{1EBB}',
- i => '\x{1EC9}',
- o => '\x{1ECF}',
- u => '\x{1EE7}',
- y => '\x{1EF7}',
- },
- "k" => { # with ogonek
- A => '\x{0104}',
- E => '\x{0118}',
- I => '\x{012E}',
- O => '\x{01EA}',
- U => '\x{0172}',
- "\\I" => '\x{012E}',
- "\\i" => '\x{012F}',
- a => '\x{0105}',
- e => '\x{0119}',
- i => '\x{012F}',
- o => '\x{01EB}',
- u => '\x{0173}',
- },
- "r" => { # with ring above
- A => '\x{00C5}',
- U => '\x{016E}',
- a => '\x{00E5}',
- u => '\x{016F}',
- w => '\x{1E98}',
- y => '\x{1E99}',
- },
- "u" => { # with breve
- A => '\x{0102}',
- E => '\x{0114}',
- G => '\x{011E}',
- I => '\x{012C}',
- O => '\x{014E}',
- U => '\x{016C}',
- "\\I" => '\x{012C}',
- "\\i" => '\x{012D}',
- a => '\x{0103}',
- e => '\x{0115}',
- g => '\x{011F}',
- i => '\x{012D}',
- o => '\x{014F}',
- u => '\x{016D}',
- },
- "v" => { # with caron
- A => '\x{01CD}',
- C => '\x{010C}',
- D => '\x{010E}',
- DZ => '\x{01C4}',
- E => '\x{011A}',
- G => '\x{01E6}',
- H => '\x{021E}',
- I => '\x{01CF}',
- K => '\x{01E8}',
- L => '\x{013D}',
- N => '\x{0147}',
- O => '\x{01D1}',
- R => '\x{0158}',
- S => '\x{0160}',
- T => '\x{0164}',
- U => '\x{01D3}',
- Z => '\x{017D}',
- "\\I" => '\x{01CF}',
- "\\i" => '\x{01D0}',
- "\\j" => '\x{01F0}',
- a => '\x{01CE}',
- c => '\x{010D}',
- d => '\x{010F}',
- dz => '\x{01C6}',
- e => '\x{011B}',
- g => '\x{01E7}',
- h => '\x{021F}',
- i => '\x{01D0}',
- j => '\x{01F0}',
- k => '\x{01E9}',
- l => '\x{013E}',
- n => '\x{0148}',
- o => '\x{01D2}',
- r => '\x{0159}',
- s => '\x{0161}',
- t => '\x{0165}',
- u => '\x{01D4}',
- z => '\x{017E}',
- },
-);
-
-#
-our %GERMAN = ( # for package `german'/`ngerman'
- '"a' => 'ä',
- '"A' => 'Ä',
- '"e' => 'ë',
- '"E' => 'Ë',
- '"i' => 'ï',
- '"I' => 'Ï',
- '"o' => 'ö',
- '"O' => 'Ö',
- '"u' => 'ü',
- '"U' => 'Ü',
- '"s' => 'ß',
- '"S' => 'SS',
- '"z' => 'ß',
- '"Z' => 'SZ',
- '"ck' => 'ck', # old spelling: ck -> k-k
- '"ff' => 'ff', # old spelling: ff -> ff-f
- '"`' => '„',
- "\"'" => '“',
- '"<' => '«',
- '">' => '»',
- '"-' => '\x{00AD}', # soft hyphen
- '""' => '\x{200B}', # zero width space
- '"~' => '\x{2011}', # non-breaking hyphen
- '"=' => '-',
- '\glq' => '‚', # left german single quote
- '\grq' => '‘', # right german single quote
- '\flqq' => '«',
- '\frqq' => '»',
- '\dq' => '"',
-);
-
-1;
-
-__END__
-=pod
-
-=encoding UTF-8
-
-=head1 NAME
-
-LaTeX::ToUnicode::Tables - Character tables for LaTeX::ToUnicode
-
-=head1 VERSION
-
-version 0.54
-
-=head1 CONSTANTS
-
-=head2 @LIGATURES
-
-Standard TeX character sequences (not \commands) which need to be
-replaced: C<---> with U+2014 (em dash), etc. Includes: em dash, en
-dash, inverted exclamation, inverted question, left double quote, right
-double quote, left single quote, right single quote. They are replaced
-in that order.
-
-=head2 %MARKUPS
-
-Hash where keys are the names of formatting commands like C<\tt>,
-without the backslash, namely: C<bf cal em it rm sc sf sl small tt>. Values
-are the obvious HTML equivalent where one exists, given as the tag name
-without the angle brackets: C<b em i tt>. Otherwise the value is the empty
-string.
-
-=head2 %ARGUMENT_COMMANDS
-
-Hash where keys are the names of TeX commands taking arguments that we
-handle, without the backslash, such as C<enquote>. Each value is a
-reference to a list of two strings, the first being the text to insert
-before the argument, the second being the text to insert after. For
-example, for C<enquote> the value is C<["`", "'"]>. The inserted text is
-subject to further replacements.
-
-Only three such commands are currently handled: C<\emph>, C<\enquote>,
-and C<\path>.
-
-=head2 %CONTROL_SYMBOLS
-
-A hash where the keys are non-alphabetic C<\command>s (without the
-backslash), other than accents and special cases. These don't take
-arguments. Although some of these have Unicode equivalents, such as the
-C<\,> thin space, it seems better to keep the output as simple as
-possible; small spacing tweaks in TeX aren't usually desirable in plain
-text or HTML.
-
-The values are single-quoted strings C<'\x{...}'>, not double-quoted
-literal characters <"\x{...}">, to ease future parsing of the
-TeX/text/HTML.
-
-This hash is necessary because TeX's parsing rules for control symbols
-are different from control words: no space or other token is needed to
-terminate control symbols.
-
-=head2 %CONTROL_WORDS
-
-Keys are names of argument-less commands, such as C<\LaTeX> (without the
-backslash). Values are the replacements, often the empty string.
-
-=head2 %SYMBOLS
-
-Keys are the commands for extended characters, such as C<\AA> (without
-the backslash.)
-
-=head2 %ACCENT_SYMBOLS
-
-Two-level hash of accented characters like C<\'{a}>. The keys of this
-hash are the accent symbols (without the backslash), such as C<`> and
-C<'>. The corresponding values are hash references where the keys are
-the base letters and the values are single-quoted C<'\x{....}'> strings.
-
-=head2 %ACCENT_LETTERS
-
-Same as %ACCENT_SYMBOLS, except the keys are accents that are
-alphabetic, such as C<\c> (without the backslash as always).
-
-As with control sequences, it's necessary to distinguish symbols and
-alphabetic commands because of the different parsing rules.
-
-=head2 %GERMAN
-
-Character sequences (not necessarily commands) as defined by the package
-`german'/`ngerman', e.g. C<"a> (a with umlaut), C<"s> (german sharp s)
-or C<"`"> (german left quote). Note the missing backslash.
-
-The keys of this hash are the literal character sequences.
-
-=head1 AUTHOR
-
-Gerhard Gossen <gerhard.gossen@googlemail.com>,
-Boris Veytsman <boris@varphi.com>,
-Karl Berry <karl@freefriends.org>
-
-L<https://github.com/borisveytsman/bibtexperllibs>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 2010-2023 Gerhard Gossen, Boris Veytsman, Karl Berry
-
-This is free software; you can redistribute it and/or modify it under
-the same terms as the Perl5 programming language system itself.
-
-=cut
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.1 b/support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.1
deleted file mode 100644
index 8dc8e71426..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.1
+++ /dev/null
@@ -1,73 +0,0 @@
-.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
-.TH LTX2UNITXT "1" "November 2023" "ltx2unitxt " "User Commands"
-.SH NAME
-ltx2unitxt \- convert LaTeX source fragment to plain (Unicode) text or simple html
-.SH SYNOPSIS
-.B ltx2unitxt
-[\fI\,-c CONFIG\/\fR] [\fI\,-o OUTPUT\/\fR] [\fI\,--html\/\fR] [...] [\fI\,INFILE\/\fR]...
-.SH DESCRIPTION
-Convert the LaTeX source in INFILE (or standard input) to plain text
-using Unicode code points for accents and other special characters; or,
-optionally, output HTML with simple translations for font changes and url
-commands.
-.PP
-Common accent sequences, special characters, and simple markup commands
-are translated, but there is no attempt at completeness. Math, tables,
-figures, sectioning, etc., are not handled in any way, and mostly left
-in their TeX form in the output. The translations assume standard LaTeX
-meanings for characters and control sequences; macros in the input are
-not considered.
-.PP
-The input can be a fragment of text, not a full document, as the purpose
-of this script was to handle bibliography entries and abstracts (for the
-ltx2crossrefxml script that is part of the crossrefware package).
-Patches to extend this script are welcome. It uses the LaTeX::ToUnicode
-Perl library for the conversion; see its documentation for details.
-.PP
-Conversion is currently done line by line, so TeX constructs that cross
-multiple lines are not handled properly. If it turns out to be useful,
-conversion could be done by paragraph instead.
-.PP
-The config file is read as a Perl source file. It can define a function
-`LaTeX_ToUnicode_convert_hook()' which will be called early; the value
-it returns (which must be a string) will then be subject to the standard
-conversion.
-.PP
-For an example of using this script and associated code, see the TUGboat
-processing at
-https://github.com/TeXUsersGroup/tugboat/tree/trunk/capsules/crossref.
-.SH OPTIONS
-.TP
-\fB\-c\fR, \fB\-\-config\fR=\fI\,FILE\/\fR
-read (Perl) config FILE for a hook, as explained above
-.TP
-\fB\-e\fR, \fB\-\-entities\fR
-output entities &#xNNNN; instead of literal characters
-.TP
-\fB\-g\fR, \fB\-\-german\fR
-handle some features of the german package
-.TP
-\fB\-h\fR, \fB\-\-html\fR
-output simplistic HTML instead of plain text
-.TP
-\fB\-o\fR, \fB\-\-output\fR=\fI\,FILE\/\fR
-output to FILE instead of stdout
-.TP
-\fB\-v\fR, \fB\-\-verbose\fR
-be verbose
-.TP
-\fB\-V\fR, \fB\-\-version\fR
-output version information and exit
-.TP
-\-?, \fB\-\-help\fR
-display this help and exit
-.PP
-Options can be abbreviated unambiguously, and start with either \- or \fB\-\-\fR.
-.PP
-Dev sources, bug tracker: https://github.com/borisveytsman/bibtexperllibs
-Releases: https://ctan.org/pkg/bibtexperllibs
-.PP
-ltx2unitxt (bibtexperllibs) 0.51
-Copyright 2023 Karl Berry.
-This is free software: you can redistribute it and/or
-modify it under the same terms as Perl itself.
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.pdf b/support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.pdf
deleted file mode 100644
index 7dfae7f396..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.pdf
+++ /dev/null
Binary files differ
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/script/convert.pl b/support/bibtexperllibs/LaTeX-ToUnicode/script/convert.pl
deleted file mode 100644
index 70cc0bda84..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/script/convert.pl
+++ /dev/null
@@ -1,156 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-use utf8;
-
-use feature 'say';
-use FindBin;
-
-my $UNICODE_DATA_URL = "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt";
-
-
-my $stream;
-if ( -f "$FindBin::Bin/UnicodeData.txt" ) {
- open $stream, "<", "$FindBin::Bin/UnicodeData.txt" or die;
-} else {
- open $stream, "-|", "curl $UNICODE_DATA_URL" or die;
-}
-my %data;
-
-my %chars = (
- 'ACUTE' => "'",
- 'ACUTE AND DOT ABOVE' => '',
- 'BAR' => '',
- 'BELT' => '',
- 'BREVE' => 'u',
- 'BREVE AND ACUTE' => '',
- 'BREVE AND DOT BELOW' => '',
- 'BREVE AND GRAVE' => '',
- 'BREVE AND HOOK ABOVE' => '',
- 'BREVE AND TILDE' => '',
- 'BREVE BELOW' => '',
- 'CARON' => 'v',
- 'CARON AND DOT ABOVE' => '',
- 'CEDILLA' => 'c',
- 'CEDILLA AND ACUTE' => '',
- 'CEDILLA AND BREVE' => '',
- 'CIRCUMFLEX' => '^',
- 'CIRCUMFLEX AND ACUTE' => '',
- 'CIRCUMFLEX AND DOT BELOW' => '',
- 'CIRCUMFLEX AND GRAVE' => '',
- 'CIRCUMFLEX AND HOOK ABOVE' => '',
- 'CIRCUMFLEX AND TILDE' => '',
- 'CIRCUMFLEX BELOW' => '',
- 'COMMA' => '',
- 'COMMA BELOW' => '',
- 'CROSSED-TAIL' => '',
- 'CURL' => '',
- 'DESCENDER' => '',
- 'DIAERESIS' => '"',
- 'DIAERESIS AND ACUTE' => '',
- 'DIAERESIS AND CARON' => '',
- 'DIAERESIS AND GRAVE' => '',
- 'DIAERESIS AND MACRON' => '',
- 'DIAERESIS BELOW' => '',
- 'DIAGONAL STROKE' => '',
- 'DOT ABOVE' => '.',
- 'DOT ABOVE AND MACRON' => '',
- 'DOT BELOW' => 'd',
- 'DOT BELOW AND DOT ABOVE' => '',
- 'DOT BELOW AND MACRON' => '',
- 'DOUBLE ACUTE' => 'H',
- 'DOUBLE BAR' => '',
- 'DOUBLE GRAVE' => '',
- 'FISHHOOK' => '',
- 'FISHHOOK AND MIDDLE TILDE' => '',
- 'FLOURISH' => '',
- 'GRAVE' => '`',
- 'HIGH STROKE' => '',
- 'HOOK' => '',
- 'HOOK ABOVE' => 'h',
- 'HOOK AND TAIL' => '',
- 'HOOK TAIL' => '',
- 'HORIZONTAL BAR' => '',
- 'HORN' => '',
- 'HORN AND ACUTE' => '',
- 'HORN AND DOT BELOW' => '',
- 'HORN AND GRAVE' => '',
- 'HORN AND HOOK ABOVE' => '',
- 'HORN AND TILDE' => '',
- 'INVERTED BREVE' => '',
- 'LEFT HOOK' => '',
- 'LINE BELOW' => '',
- 'LONG LEG' => '',
- 'LONG RIGHT LEG' => '',
- 'LONG STROKE OVERLAY' => '',
- 'LOOP' => '',
- 'LOW RING INSIDE' => '',
- 'MACRON' => '=',
- 'MACRON AND ACUTE' => '',
- 'MACRON AND DIAERESIS' => '',
- 'MACRON AND GRAVE' => '',
- 'MIDDLE DOT' => '',
- 'MIDDLE TILDE' => '',
- 'NOTCH' => '',
- 'OGONEK' => 'k',
- 'OGONEK AND MACRON' => '',
- 'PALATAL HOOK' => '',
- 'RETROFLEX HOOK' => '',
- 'RIGHT HALF RING' => '',
- 'RIGHT HOOK' => '',
- 'RING ABOVE' => 'r',
- 'RING ABOVE AND ACUTE' => '',
- 'RING BELOW' => '',
- 'SMALL LETTER J' => '',
- 'SMALL LETTER Z' => '',
- 'SMALL LETTER Z WITH CARON' => '',
- 'SQUIRREL TAIL' => '',
- 'STRIKETHROUGH' => '',
- 'STROKE' => '',
- 'STROKE AND ACUTE' => '',
- 'STROKE AND DIAGONAL STROKE' => '',
- 'STROKE THROUGH DESCENDER' => '',
- 'SWASH TAIL' => '',
- 'TAIL' => '',
- 'TILDE' => '~',
- 'TILDE AND ACUTE' => '',
- 'TILDE AND DIAERESIS' => '',
- 'TILDE AND MACRON' => '',
- 'TILDE BELOW' => '',
- 'TOPBAR' => '',
-);
-
-my %missing;
-
-while(<$stream>) {
- chomp;
- my @F = split /;/;
- my $hex = $F[0];
- if ( $F[1] =~ /LATIN (SMALL|CAPITAL) LETTER ((?:\w+ )*\w{1,2}) WITH (.+)$/ ) {
- my $case = $1;
- my $letter = $2;
- my $accent = $3;
-
- if ( $case eq 'SMALL' ) {
- $letter = lc $letter;
- }
- if ( $chars{$accent} && $letter !~ / / ) {
- my $char = chr( eval "0x$hex" );
- $data{ $chars{$accent} }->{ $letter } = $char;
- if ( lc( $letter ) eq 'i' ) {
- my $additional_letter = "\\$letter";
- $data{ $chars{$accent} }->{ $additional_letter } = $char;
- }
- } else {
- push @{ $missing{$accent} }, $letter;
- }
- }
-}
-
-use Data::Dumper::Concise;
-
-binmode(STDOUT, ":utf8");
-
-say Dumper( \%data );
-#say Dumper( \%missing );
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/script/ltx2unitxt b/support/bibtexperllibs/LaTeX-ToUnicode/script/ltx2unitxt
deleted file mode 100755
index 661ea40417..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/script/ltx2unitxt
+++ /dev/null
@@ -1,169 +0,0 @@
-#!/usr/bin/env perl
-# Use the LaTeX::ToUnicode module (also in the bibtexperllibs
-# repository/package, like this script) to convert LaTeX to Unicode.
-#
-# We work on fragments of text, not whole documents, the goal being to
-# replace LaTeX commands and syntax with obvious plain text equivalents,
-# or remove them.
-
-use strict;
-use warnings;
-
-use Cwd;
-use File::Basename;
-use File::Spec;
-
-BEGIN {
- # find files relative to our installed location within TeX Live
- chomp(my $TLMaster = `kpsewhich -var-value=SELFAUTOPARENT`); # TL root
- if (length($TLMaster)) {
- unshift @INC, "$TLMaster/texmf-dist/scripts/bibtexperllibs";
- }
- # find development bibtexperllibs in sibling checkout to this script,
- # even if $0 is a symlink. Irrelevant when using from an installation.
- my $real0 = Cwd::abs_path($0);
- my $scriptdir = File::Basename::dirname($real0);
- my $dev_btxperllibs = Cwd::abs_path("$scriptdir/../..");
-
- # we need the lib/ subdirectories inside ...
- unshift (@INC, glob ("$dev_btxperllibs/*/lib")) if -d $dev_btxperllibs;
-
-}
-
-use LaTeX::ToUnicode;
-
-our %opts;
-local *OUT; # output filehandle
-
-exit(main());
-
-sub main {
- init();
-
- # by paragraph?
- while (<>) {
- print OUT (convert($_));
- }
-
- return 0;
-}
-
-sub convert {
- my ($in) = @_;
-
- my @args = (); # what we'll pass to the convert() fn.
- #
- if (defined(&{"LaTeX_ToUnicode_convert_hook"})) {
- push (@args, "hook" => \&LaTeX_ToUnicode_convert_hook); }
- if ($opts{e}) { push (@args, "entities" => 1); }
- if ($opts{g}) { push (@args, "german" => 1); }
- if ($opts{h}) { push (@args, "html" => 1); }
-
- LaTeX::ToUnicode::debuglevel($opts{v});
- my $out = LaTeX::ToUnicode::convert($in, @args);
-
- #warn "out=$out";
- return $out;
-}
-
-
-# Command line options, etc.
-#
-sub init {
- my $USAGE = <<END;
-Usage: $0 [-c CONFIG] [-o OUTPUT] [--html] [...] [INFILE]...
-
-Convert the LaTeX source in INFILE (or standard input) to plain text
-using Unicode code points for accents and other special characters; or,
-optionally, output HTML with simple translations for font changes and url
-commands.
-
-Common accent sequences, special characters, and simple markup commands
-are translated, but there is no attempt at completeness. Math, tables,
-figures, sectioning, etc., are not handled in any way, and mostly left
-in their TeX form in the output. The translations assume standard LaTeX
-meanings for characters and control sequences; macros in the input are
-not considered.
-
-The input can be a fragment of text, not a full document, as the purpose
-of this script was to handle bibliography entries and abstracts (for the
-ltx2crossrefxml script that is part of the crossrefware package).
-Patches to extend this script are welcome. It uses the LaTeX::ToUnicode
-Perl library for the conversion; see its documentation for details.
-
-Conversion is currently done line by line, so TeX constructs that cross
-multiple lines are not handled properly. If it turns out to be useful,
-conversion could be done by paragraph instead.
-
-The config file is read as a Perl source file. It can define a function
-`LaTeX_ToUnicode_convert_hook()' which will be called early; the value
-it returns (which must be a string) will then be subject to the standard
-conversion.
-
-For an example of using this script and associated code, see the TUGboat
-processing at
-https://github.com/TeXUsersGroup/tugboat/tree/trunk/capsules/crossref.
-
-Options:
- -c, --config=FILE read (Perl) config FILE for a hook, as explained above
- -e, --entities output entities &#xNNNN; instead of literal characters
- -g, --german handle some features of the german package
- -h, --html output simplistic HTML instead of plain text
- -o, --output=FILE output to FILE instead of stdout
- -v, --verbose be verbose
- -V, --version output version information and exit
- -?, --help display this help and exit
-
-Options can be abbreviated unambiguously, and start with either - or --.
-
-Dev sources, bug tracker: https://github.com/borisveytsman/bibtexperllibs
-Releases: https://ctan.org/pkg/bibtexperllibs
-END
-
- my $VERSION = <<END;
-ltx2unitxt (bibtexperllibs) 0.51
-Copyright 2023 Karl Berry.
-This is free software: you can redistribute it and/or
-modify it under the same terms as Perl itself.
-END
-
- use Getopt::Long qw(:config no_ignore_case); # otherwise v|V is the same
-
- GetOptions(
- "config|c=s" => \($opts{c}),
- "entities|e" => \($opts{e}),
- "german|g" => \($opts{g}),
- "html|h" => \($opts{h}),
- "output|o=s" => \($opts{o}),
- "verbose|v" => \($opts{v}),
- "version|V" => \($opts{V}),
- "help|?" => \($opts{help}))
- || die "Try $0 --help for more information.\n";
-
- if ($opts{help}) { print "$USAGE\n$VERSION"; exit 0; }
- if ($opts{V}) { print $VERSION; exit 0; }
-
- binmode(STDOUT, ":utf8");
- *OUT = *STDOUT;
-
- if (defined($opts{o})) {
- open(OUT, ">$opts{o}") || die "open(>$opts{o}) failed: $!\n";
- binmode(OUT, ":utf8")
- }
-
- if ($opts{c}) {
- if (-r $opts{c}) {
- # if config arg is absolute, fine; if not, prepend "./" as slightly
- # less troublesome than putting "." in the @INC path.
- my $rel = (File::Spec->file_name_is_absolute($opts{c}) ? "" : "./");
- my $cnffile = "$rel$opts{c}";
- verbose("requiring config file: $cnffile");
- require $cnffile;
- } else {
- die "open config file ($opts{c}) for reading failed: $!\n";
- }
- }
-}
-
-
-sub verbose { print @_ if $::opts{v}; }
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/t/convert.t b/support/bibtexperllibs/LaTeX-ToUnicode/t/convert.t
deleted file mode 100644
index 9bd7a4f3d4..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/t/convert.t
+++ /dev/null
@@ -1,136 +0,0 @@
-use strict;
-use warnings;
-
-use Test::More;
-use utf8;
-
-BEGIN{ use_ok( 'LaTeX::ToUnicode', qw( convert ) ); }
-
-binmode( STDOUT, ':utf8' );
-my @tests = (
- [ '\LaTeX' => 'LaTeX' ],
- [ '\$ \% \& \_ \{ \} \#' => '$ % & _ { } #' ],
- [ '{\"{a}}' => 'ä' ],
- [ '{\"a}' => 'ä' ],
- [ '{\`{a}}' => 'à' ],
- [ '{\`a}' => 'à' ],
- [ '\ae' => 'æ' ],
- [ '\L' => 'Ł' ],
- [ "{\\'e}" => 'é'],
- ['\={a}' => 'ā'],
- ['{\=a}' => 'ā'],
-);
-
-foreach my $test ( @tests ) {
- is( convert( $test->[0] ), $test->[1], "Convert $test->[0]" );
-}
-
-my @german_tests = (
- [ '"a' => 'ä' ],
- ['"`' => '„' ],
- ["\"'" => '“' ],
-);
-
-foreach my $test ( @german_tests ) {
- is( convert( $test->[0], german => 1 ), $test->[1], "Convert $test->[0], german => 1" );
-}
-
-binmode( DATA, ':utf8' );
-while (<DATA>) {
- chomp;
- my ( $tex, $result ) = split /\t/;
- is( convert( $tex ), $result, "Convert $tex" );
-}
-close DATA;
-
-done_testing;
-
-__DATA__
-\& &
-{\`a} à
-{\^a} â
-{\~a} ã
-{\'a} á
-{\'{a}} á
-{\"a} ä
-{\`A} À
-{\'A} Á
-{\"A} Ä
-{\aa} å
-{\AA} Å
-{\ae} æ
-{\bf 12} 12
-{\'c} ć
-{\cal P} P
-{\c{c}} ç
-{\c{C}} Ç
-{\c{e}} ȩ
-{\c{s}} ş
-{\c{S}} Ş
-{\c{t}} ţ
-{\-d} d
-{\`e} è
-{\^e} ê
-{\'e} é
-{\"e} ë
-{\'E} É
-{\em bits} bits
-{\H{o}} ő
-{\`i} ì
-{\^i} î
-{\i} ı
-{\`i} ì
-{\'i} í
-{\"i} ï
-{\`\i} ì
-{\'\i} í
-{\"\i} ï
-{\`{\i}} ì
-{\'{\i}} í
-{\"{\i}} ï
-{\it Note} Note
-{\k{e}} ę
-{\l} ł
-{\-l} l
-{\log} log
-{\~n} ñ
-{\'n} ń
-{\^o} ô
-{\o} ø
-{\'o} ó
-{\"o} ö
-{\"{o}} ö
-{\'O} Ó
-{\"O} Ö
-{\"{O}} Ö
-{\rm always} always
-{\-s} s
-{\'s} ś
-{\sc JoiN} JoiN
-{\sl bit\/ \bf 7} bit 7
-{\sl L'Informatique Nouvelle} L’Informatique Nouvelle
-{\small and} and
-{\ss} ß
-{\TeX} TeX
-{\TM} ™
-{\tt awk} awk
-{\^u} û
-{\'u} ú
-{\"u} ü
-{\"{u}} ü
-{\'U} Ú
-{\"U} Ü
-{\u{a}} ă
-{\u{g}} ğ
-{\v{c}} č
-{\v{C}} Č
-{\v{e}} ě
-{\v{n}} ň
-{\v{r}} ř
-{\v{s}} š
-{\v{S}} Š
-{\v{z}} ž
-{\v{Z}} Ž
-{\'y} ý
-{\.{z}} ż
-Herv{\`e} Br{\"o}nnimann Hervè Brönnimann
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-coverage.t b/support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-coverage.t
deleted file mode 100644
index 3a818499f0..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-coverage.t
+++ /dev/null
@@ -1,21 +0,0 @@
-#!perl
-
-BEGIN {
- unless ($ENV{RELEASE_TESTING}) {
- require Test::More;
- Test::More::plan(skip_all => 'these tests are for release candidate testing');
- }
-}
-
-
-use Test::More;
-
-eval "use Test::Pod::Coverage 1.08";
-plan skip_all => "Test::Pod::Coverage 1.08 required for testing POD coverage"
- if $@;
-
-eval "use Pod::Coverage::TrustPod";
-plan skip_all => "Pod::Coverage::TrustPod required for testing POD coverage"
- if $@;
-
-all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' });
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-syntax.t b/support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-syntax.t
deleted file mode 100644
index d46a955694..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-syntax.t
+++ /dev/null
@@ -1,15 +0,0 @@
-#!perl
-
-BEGIN {
- unless ($ENV{RELEASE_TESTING}) {
- require Test::More;
- Test::More::plan(skip_all => 'these tests are for release candidate testing');
- }
-}
-
-use Test::More;
-
-eval "use Test::Pod 1.41";
-plan skip_all => "Test::Pod 1.41 required for testing POD" if $@;
-
-all_pod_files_ok();
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/t/release-synopsis.t b/support/bibtexperllibs/LaTeX-ToUnicode/t/release-synopsis.t
deleted file mode 100644
index 7a83682539..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/t/release-synopsis.t
+++ /dev/null
@@ -1,16 +0,0 @@
-#!perl
-
-BEGIN {
- unless ($ENV{RELEASE_TESTING}) {
- require Test::More;
- Test::More::plan(skip_all => 'these tests are for release candidate testing');
- }
-}
-
-
-use Test::More;
-
-eval "use Test::Synopsis";
-plan skip_all => "Test::Synopsis required for testing synopses"
- if $@;
-all_synopsis_ok('lib');
diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/weaver.ini b/support/bibtexperllibs/LaTeX-ToUnicode/weaver.ini
deleted file mode 100644
index 1cc341ff23..0000000000
--- a/support/bibtexperllibs/LaTeX-ToUnicode/weaver.ini
+++ /dev/null
@@ -1,24 +0,0 @@
-[-Encoding]
-[@CorePrep]
-
-[Name]
-[Version]
-
-[Region / prelude]
-
-[Generic / SYNOPSIS]
-[Generic / DESCRIPTION]
-[Generic / OVERVIEW]
-
-[Collect / ATTRIBUTES]
-command = attr
-
-[Collect / METHODS]
-command = method
-
-[Leftovers]
-
-[Region / postlude]
-
-[Authors]
-[Legal]
diff --git a/support/bibtexperllibs/Makefile b/support/bibtexperllibs/Makefile
deleted file mode 100644
index d1b0bdc84d..0000000000
--- a/support/bibtexperllibs/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# This is Makefile for TDS-compliant TeX distributions
-# Written by Boris Veytsman, boris@varphi.com
-#
-# This file is in public domain
-#
-
-PACKAGE = bibtexperllibs
-
-DIRS = BibTeX-Parser LaTeX-ToUnicode
-
-all:
-
-clean:
- for dir in ${DIRS}; do (cd $$dir && ${MAKE} -f Makefile.TDS clean); done
-
-
-distclean: clean
- for dir in ${DIRS}; do (cd $$dir && ${MAKE} -f Makefile.TDS distclean); done
-
-install:
- for dir in ${DIRS}; do (cd $$dir && ${MAKE} -f Makefile.TDS install); done
-
-archive:
- for dir in ${DIRS}; do (cd $$dir && ${MAKE} -f Makefile.TDS docs); done
- for dir in ${DIRS}; do (cd $$dir && ${MAKE} -f Makefile.TDS clean); done
- COPYFILE_DISABLE=1 tar -czvf ../$(PACKAGE).tgz -C .. --exclude '*~' --exclude '*.tgz' --exclude CVS --exclude .git --exclude .gitignore --exclude blib --exclude "*.tar.gz" --exclude pm_to_blib $(PACKAGE)
diff --git a/support/bibtexperllibs/README b/support/bibtexperllibs/README
deleted file mode 100644
index fef3d0b276..0000000000
--- a/support/bibtexperllibs/README
+++ /dev/null
@@ -1,49 +0,0 @@
- BibTeX Perl Libs
- Version 1.9
- Gerhard Gossen, Boris Veytsman, Karl Berry
-
-This package provides BibTeX-related Perl libraries by Gerhard Gossen,
-maintained and repackaged by Boris Veytsman for TeX Live and other
-TDS-compliant distributions. The libraries are written in pure Perl,
-so shoud work out of the box on any architecture.
-
-To use them in your scripts, add to the @INC variable the directory
-scripts/bibtexperllibs inside your TeX distribution. A script ltx2unitxt
-packages the conversion libraries for use from the command line.
-
-Bug reports, source code: https://github.com/borisveytsman/bibtexperllibs
-Releases: https://ctan.org/pkg/bibtexperllibs
-
-For an example of using the LaTeX::ToUnicode module, see the
-crossrefware package (which is also the reason for continued development).
-
-Changes:
-
- version 1.9 2023-11-18 Now braces are rendered correctly by
- LaTeX-ToUnicode
-
- version 1.8 2023-08-20 Tests updates, timestamp updates.
-
- version 1.7 2021-01-20 LaTeX::ToUnicode 0.51 for still more
- ltx2crossrefxml support, including simple html output.
- (No changes to BibTeX::Parser.)
-
- version 1.6 2020-12-10 LaTeX::ToUnicode 0.11 for more ltx2crossrefxml
- support. (No changes to BibTeX::Parser.)
-
- version 1.5 Upgraded BibTeX::Parser to 1.02 (bugfixes)
-
- version 1.4 Upgraded BibTeX::Parser to 1.01
-
- version 1.3 Upgraded BibTeX::Parser to 1.00
-
- version 1.2 Upgraded BibTeX::Parser to v0.70 and LaTeX::ToUnicode to 0.05
-
- version 1.1 Upgraded BibTeX::Parser to v0.69
-
- version 1.0 Upgraded BibTeX::Parser to v0.68 and LaTeX::ToUnicode to 0.04
-
- version 0.2 New upstream version for BibTeX::Parser (0.66)
-
-This is free software; you can redistribute it and/or modify it under
-the same terms as the Perl 5 programming language system itself.