summaryrefslogtreecommitdiff
path: root/graphics/pgf
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pgf')
-rw-r--r--graphics/pgf/contrib/aiplans/Aiplans-Introduction.pdfbin0 -> 505453 bytes
-rw-r--r--graphics/pgf/contrib/aiplans/LICENSE.txt415
-rw-r--r--graphics/pgf/contrib/aiplans/README.md80
-rw-r--r--graphics/pgf/contrib/aiplans/README.pdfbin0 -> 67103 bytes
-rw-r--r--graphics/pgf/contrib/aiplans/tikzlibraryaiplans.code.tex121
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/changelog.tex34
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdfbin13867 -> 13875 bytes
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdfbin2431321 -> 2451275 bytes
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex182
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz.sty4
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex254
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex78
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex6
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex4
-rw-r--r--graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.pdfbin504537 -> 1039619 bytes
-rw-r--r--graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.tex41
-rw-r--r--graphics/pgf/contrib/outilsgeomtikz/tex/OutilsGeomTikz.sty141
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/README10
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex2
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex29
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty44
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdfbin7570685 -> 7558395 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex2
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex18
-rw-r--r--graphics/pgf/contrib/pgfplotsthemebeamer/DEPENDS.txt3
-rw-r--r--graphics/pgf/contrib/pgfplotsthemebeamer/README.md6
-rw-r--r--graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc-settings.sty2
-rw-r--r--graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.pdfbin149887 -> 150527 bytes
-rw-r--r--graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.tex12
-rw-r--r--graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer.sty16
-rw-r--r--graphics/pgf/contrib/polyomino/README.md25
-rw-r--r--graphics/pgf/contrib/polyomino/polyomino.pdfbin0 -> 109235 bytes
-rw-r--r--graphics/pgf/contrib/polyomino/polyomino.sty286
-rw-r--r--graphics/pgf/contrib/polyomino/polyomino.tex278
-rw-r--r--graphics/pgf/contrib/wordle/README.md41
-rw-r--r--graphics/pgf/contrib/wordle/doc/wordle-doc-en.pdfbin284036 -> 0 bytes
-rw-r--r--graphics/pgf/contrib/wordle/doc/wordle-doc-en.tex426
-rw-r--r--graphics/pgf/contrib/wordle/doc/wordle-doc-fr.pdfbin279989 -> 0 bytes
-rw-r--r--graphics/pgf/contrib/wordle/doc/wordle-doc-fr.tex422
-rw-r--r--graphics/pgf/contrib/wordle/tex/wordle.sty298
-rw-r--r--graphics/pgf/contrib/wordle/wordle-doc-en.pdfbin0 -> 266174 bytes
-rw-r--r--graphics/pgf/contrib/wordle/wordle-doc-en.tex921
-rw-r--r--graphics/pgf/contrib/wordle/wordle-doc-fr.pdfbin0 -> 264372 bytes
-rw-r--r--graphics/pgf/contrib/wordle/wordle-doc-fr.tex767
-rw-r--r--graphics/pgf/contrib/wordle/wordle.sty670
45 files changed, 4207 insertions, 1431 deletions
diff --git a/graphics/pgf/contrib/aiplans/Aiplans-Introduction.pdf b/graphics/pgf/contrib/aiplans/Aiplans-Introduction.pdf
new file mode 100644
index 0000000000..9c8cc89460
--- /dev/null
+++ b/graphics/pgf/contrib/aiplans/Aiplans-Introduction.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/aiplans/LICENSE.txt b/graphics/pgf/contrib/aiplans/LICENSE.txt
new file mode 100644
index 0000000000..4db9b5af29
--- /dev/null
+++ b/graphics/pgf/contrib/aiplans/LICENSE.txt
@@ -0,0 +1,415 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2008-05-04
+
+Copyright 1999 2002-2008 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. Activities other than distribution and/or modification of the Work
+are not covered by this license; they are outside its scope. In
+particular, the act of running the Work is not restricted and no
+requirements are made concerning any offers of support for the Work.
+
+2. You may distribute a complete, unmodified copy of the Work as you
+received it. Distribution of only part of the Work is considered
+modification of the Work, and no right to distribute such a Derived
+Work may be assumed under the terms of this clause.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+above, as long as that Compiled Work is distributed in such a way that
+the recipients may install the Compiled Work on their system exactly
+as it would have been installed if they generated a Compiled Work
+directly from the Work.
+
+4. If you are the Current Maintainer of the Work, you may, without
+restriction, modify the Work, thus creating a Derived Work. You may
+also distribute the Derived Work without restriction, including
+Compiled Works generated from the Derived Work. Derived Works
+distributed in this manner by the Current Maintainer are considered to
+be updated versions of the Work.
+
+5. If you are not the Current Maintainer of the Work, you may modify
+your copy of the Work, thus creating a Derived Work based on the Work,
+and compile this Derived Work, thus creating a Compiled Work based on
+the Derived Work.
+
+6. If you are not the Current Maintainer of the Work, you may
+distribute a Derived Work provided the following conditions are met
+for every component of the Work unless that component clearly states
+in the copyright notice that it is exempt from that condition. Only
+the Current Maintainer is allowed to add such statements of exemption
+to a component of the Work.
+
+ a. If a component of this Derived Work can be a direct replacement
+ for a component of the Work when that component is used with the
+ Base Interpreter, then, wherever this component of the Work
+ identifies itself to the user when used interactively with that
+ Base Interpreter, the replacement component of this Derived Work
+ clearly and unambiguously identifies itself as a modified version
+ of this component to the user when used interactively with that
+ Base Interpreter.
+
+ b. Every component of the Derived Work contains prominent notices
+ detailing the nature of the changes to that component, or a
+ prominent reference to another file that is distributed as part
+ of the Derived Work and that contains a complete and accurate log
+ of the changes.
+
+ c. No information in the Derived Work implies that any persons,
+ including (but not limited to) the authors of the original version
+ of the Work, provide any support, including (but not limited to)
+ the reporting and handling of errors, to recipients of the
+ Derived Work unless those persons have stated explicitly that
+ they do provide such support for the Derived Work.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. A complete, unmodified copy of the Work;
+ if your distribution of a modified component is made by
+ offering access to copy the modified component from a
+ designated place, then offering equivalent access to copy
+ the Work from the same or some similar place meets this
+ condition, even though third parties are not compelled to
+ copy the Work along with the modified component;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. If you are not the Current Maintainer of the Work, you may
+distribute a Compiled Work generated from a Derived Work, as long as
+the Derived Work is distributed to all recipients of the Compiled
+Work, and as long as the conditions of Clause 6, above, are met with
+regard to the Derived Work.
+
+8. The conditions above are not intended to prohibit, and hence do not
+apply to, the modification, by any method, of any component so that it
+becomes identical to an updated version of that component of the Work as
+it is distributed by the Current Maintainer under Clause 4, above.
+
+9. Distribution of the Work or any Derived Work in an alternative
+format, where the Work or that Derived Work (in whole or in part) is
+then produced by applying some process to that format, does not relax or
+nullify any sections of this license as they pertain to the results of
+applying that process.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. If a Derived Work is distributed under a different license, that
+ Derived Work must provide sufficient documentation as part of
+ itself to allow each recipient of that Derived Work to honor the
+ restrictions in Clause 6 above, concerning changes from the Work.
+
+11. This license places no restrictions on works that are unrelated to
+the Work, nor does this license place any restrictions on aggregating
+such works with the Work by any means.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `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 Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. Make a reasonable attempt to trace the Current Maintainer (and
+ the Copyright Holder, if the two differ) through the means of
+ an Internet or similar search.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. If the search is unsuccessful or no action to resume active
+ maintenance is taken by the Current Maintainer, then announce
+ within the pertinent community your intention to take over
+ maintenance. (If the Work is a LaTeX work, this could be
+ done, for example, by posting to comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. If the Current Maintainer is not reachable and the Copyright
+ Holder agrees that maintenance of the Work be passed to you,
+ then this takes effect immediately upon announcement.
+
+ 4. If you make an `intention announcement' as described in 2b. above
+ and after three months your intention is challenged neither by
+ the Current Maintainer nor by the Copyright Holder nor by other
+ people, then you may arrange for the Work to be changed so as
+ to name you as the (new) Current Maintainer.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+This section contains important instructions, examples, and
+recommendations for authors who are considering distributing their
+works under this license. These authors are addressed as `you' in
+this section.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `modguide.tex' in the base LaTeX distribution explains
+the motivation behind the conditions of this license. It explains,
+for example, why distributing LaTeX under the GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+It is wise never to modify a component of the Work, even for your own
+personal use, without also meeting the above conditions for
+distributing the modified component. While you might intend that such
+modifications will never be distributed, often this will happen by
+accident -- you may forget that you have modified that component; or
+it may not occur to you when allowing others to access the modified
+version that you are thus distributing it and violating the conditions
+of this license in ways that could have legal implications and, worse,
+cause problems for the community. It is therefore usually in your
+best interest to keep your copy of the Work identical with the public
+one. Many works provide ways to control the behavior of that work
+without altering any of its licensed components.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% pig.dtx
+ %% Copyright 2005 M. Y. Name
+ %
+ % This work may be distributed and/or modified under the
+ % conditions of the LaTeX Project Public License, either version 1.3
+ % of this license or (at your option) any later version.
+ % The latest version of this license is in
+ % http://www.latex-project.org/lppl.txt
+ % and version 1.3 or later is part of all distributions of LaTeX
+ % version 2005/12/01 or later.
+ %
+ % This work has the LPPL maintenance status `maintained'.
+ %
+ % The Current Maintainer of this work is M. Y. Name.
+ %
+ % This work consists of the files pig.dtx and pig.ins
+ % and the derived file pig.sty.
+
+Given such a notice and statement in a file, the conditions
+given in this license document would apply, with the `Work' referring
+to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ in that place. In the absence of an unequivocal list it might be
+ impossible for the licensee to determine what is considered by you
+ to comprise the Work and, in such a case, the licensee would be
+ entitled to make reasonable conjectures as to which files comprise
+ the Work.
diff --git a/graphics/pgf/contrib/aiplans/README.md b/graphics/pgf/contrib/aiplans/README.md
new file mode 100644
index 0000000000..7e50eef9c0
--- /dev/null
+++ b/graphics/pgf/contrib/aiplans/README.md
@@ -0,0 +1,80 @@
+# <aiplans>: A TikZ-Based Library for Drawing POCL Plans
+
+<aiplans> is a specialized LaTeX package designed to assist scientists, students, and professionals in creating high-quality graphical representations, particularly Partial Order Causal Link (POCL) plans. Built on the robust TikZ framework, this library simplifies the process of generating complex, precise diagrams that are essential for academic and scientific communication. Our package is especially useful in fields such as artificial intelligence and automated planned, where visualizing causal relationships and dependencies is fundamental.
+
+## Content
+
+- [Project Structure](#project-structure)
+- [License](#license)
+- [Future Improvements Plan](#future-improvements-plan)
+- [Contact Information](#contact-information)
+- [Team Members](#team-members)
+
+## Project Structure
+
+Aiplans/
+
+├── **README.md**
+
+├── **README.pdf**
+
+├── **Aiplans-Introdution-source-code.zip**
+
+├── **Aiplans-Introdution.pdf**
+
+├── **tikzlibraryaiplans.code.tex**
+
+└── **License.txt**
+
+
+### Explanation
+
+- **README**: This file provides an overview of the project, including installation instructions, system requirements, and other essential information.
+- **Aiplans-Introdution-source-code.zip**: Introduction file Latex source code.
+- **Aiplans-Introdution.pdf**: Detailed instructions on how to use the TikZ library included in this package. It covers the steps needed to generate diagrams using LaTeX.
+- **tikzlibraryaiplans.code.tex**: The core of the project, this file contains the TikZ library specifically designed for generating AI plan diagrams. This package is crucial for the functionality provided by this project.
+- **License.txt**: The license file outlines the terms under which the package can be used, modified, and distributed.
+
+
+## License
+
+This material is subject to the [LaTeX Project Public License 1.3c](https://ctan.org/license/lppl1.3).
+
+## Future Improvements Plan
+
+As we continue to improve and expand the `<aiplans>` package, the following developments are planned for the upcoming future:
+
+### In Scope
+
+1. **Extension Features for v1.0**:
+ - **Vertical Diagram Support**: We aim to enhance the package by introducing the ability to create vertical diagrams, which will provide more flexibility in visualizing POCL plans.
+ - **Dynamic Precondition/Effect Lengths**: After the package update, the lengths of the lines will be automatically adjusted based on the actual length of the text labels. In other words, if the label's text content is longer, the corresponding line will also be lengthened; if the label's text content is shorter, the line will be shortened accordingly. This dynamic adjustment allows the diagram to more flexibly adapt to various content requirements, resulting in a final diagram that is more visually appealing and clear.
+
+2. **Code Translator**:
+ - **PDDL/HDDL Code Translation**: We are developing a code translator that can accurately convert PDDL (Planning Domain Definition Language) and HDDL (Hierarchical Domain Definition Language) code into the schema format used by our `<aiplans>` library. This feature will streamline the process of diagram creation from existing codebases or at least allow to specify the tikz code in another syntax that might be more familiar to some.
+
+## Contact Information
+
+If you have any questions, feedback, or suggestions regarding this project, please feel free to reach out to us. We are always happy to assist and appreciate your input.
+
+**Email:** [u7166251@anu.edu.au](mailto:u7166251@anu.edu.au) (Yikai Ge)
+For reporting bugs or requesting features.
+
+We strive to respond to all inquiries as quickly as possible.
+
+## Team Members
+
+This project is developed by a team of students from the Australian National University (ANU), guided by our client. He provided us with the initial idea and relevant references, playing a crucial role in shaping the direction of our research.
+
+### Client
+- **Pascal Bercher**
+
+### Maintainers
+- **Yikai Ge**
+- **Chen Wang**
+- **Cheng Zhou**
+- **Lujia Li**
+- **Yinyin Chen**
+- **Xinni Song**
+
+We have worked closely with our client to ensure that the project meets their requirements and delivers high-quality results.
diff --git a/graphics/pgf/contrib/aiplans/README.pdf b/graphics/pgf/contrib/aiplans/README.pdf
new file mode 100644
index 0000000000..cca41d75a7
--- /dev/null
+++ b/graphics/pgf/contrib/aiplans/README.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/aiplans/tikzlibraryaiplans.code.tex b/graphics/pgf/contrib/aiplans/tikzlibraryaiplans.code.tex
new file mode 100644
index 0000000000..5b6d23860c
--- /dev/null
+++ b/graphics/pgf/contrib/aiplans/tikzlibraryaiplans.code.tex
@@ -0,0 +1,121 @@
+\ProvidesPackage{aiplan}
+\RequirePackage{tikz}
+\RequirePackage{listofitems}
+\usetikzlibrary{calc}
+\usetikzlibrary{decorations.pathreplacing, decorations.markings}
+
+
+\tikzset{
+ action/.style n args={8}{
+ draw,
+ minimum width=3cm,
+ fill=blue,
+ rounded corners,
+ minimum height={max(#1,#2)*\baseHeight cm + 0.5*\baseHeight cm},
+ label={center:#7},
+ append after command={
+ \pgfextra{
+ % Define the node name
+ \edef\nodename{\tikzlastnode}
+ \ifx#3\empty % Check if label list is empty
+ \else % Process only if not empty
+ % Read the label content
+ \setsepchar{,}
+ \readlist\nameparts{\nodename}
+ \setsepchar{,}
+
+ \ifnum#8=0\relax
+ % Define positions for preconditions and effects relative to the node with shifts
+ \ifnum#1>0
+ \readlist\labellist{#3}
+ \foreach \i in {1,...,#1} {
+ % Precondition coordinates and lines
+ \coordinate (\nodename-pre-\i) at ([xshift=-#5cm, yshift=(-\i + (#1)/2+0.25) * \baseHeight cm] \nodename.west);
+ \draw (\nodename.west |- \nodename-pre-\i) -- +(-#5,0) node [midway, above, sloped, font=\scriptsize] {\labellist[\i]};
+ }
+ \fi;
+ \readlist\labellist{#4}
+ \ifnum#2>0
+ \foreach \j in {1,...,#2} {
+ % Effect coordinates and lines
+ \coordinate (\nodename-eff-\j) at ([xshift=#6cm, yshift=(-\j + (#2)/2+0.25) * \baseHeight cm] \nodename.east);
+ \draw (\nodename.east |- \nodename-eff-\j) -- +(#6,0) node [midway, above, sloped, font=\scriptsize] {\labellist[\j]};
+ }
+ \fi;
+ \else
+ \ifnum#1>0
+ \readlist\labellist{#3}
+ \foreach \i in {1,...,#1} {
+ % Precondition coordinates and lines
+ \coordinate (\nodename-pre-\i) at ([xshift=-#5 cm, yshift=(-\i + (#1)/2+0.25) * \baseHeight cm] \nodename.west);
+ \draw (\nodename.west |- \nodename-pre-\i) -- +(-#5,0) node [midway, anchor=east, xshift=-0.5 cm, sloped, font=\scriptsize]{\labellist[\i]};
+ }
+ \fi;
+ \readlist\labellist{#4}
+ \ifnum#2>0
+ \foreach \j in {1,...,#2} {
+ % Effect coordinates and lines
+ \coordinate (\nodename-eff-\j) at ([xshift=#6 cm, yshift=(-\j + (#2)/2+0.25) * \baseHeight cm] \nodename.east);
+ \draw (\nodename.east |- \nodename-eff-\j) -- +(#6,0) node [midway,anchor=west, xshift=0.5 cm, font=\scriptsize] {\labellist[\j]};
+ }
+ \fi;
+ \fi;
+ \fi;
+ }
+ },
+ label content/.initial={#3}
+ }
+}
+
+
+% Common base style for nodes
+\tikzset{
+ % COMMENT MISSING
+ base/.style n args={5}{
+ draw,
+ minimum width=0.05cm,
+ fill=black,
+ minimum height={#1*\baseHeight cm},
+ append after command={
+ \pgfextra{
+ \edef\nodename{\tikzlastnode}
+ \setsepchar{,}
+ \readlist\labellist{#2}
+ \foreach \i in {1,...,#1} {
+ \coordinate (\nodename-#5-\i) at ([xshift=#3 cm, yshift=(-\i + (#1)/2+0.25) * \baseHeight cm] \nodename.#4);
+ \draw (\nodename.#4 |- \nodename-#5-\i) -- +(#3,0)
+ node [midway, above, sloped, font=\scriptsize] {\labellist[\i]};
+ }
+ }
+ }
+ }
+}
+
+\tikzset{
+ % Init style
+ init/.style n args={3}{
+ base={#1}{#2}{#3}{east}{eff}
+ }
+}
+
+\tikzset{
+ % Goal style
+ goal/.style n args={3}{
+ base={#1}{#2}{-#3}{west}{pre}
+ }
+}
+
+
+
+\tikzset{
+ dot/.style={
+ circle,fill,inner sep=0.1em
+ }
+}
+
+\tikzset{
+ causallink/.style={
+ ->, shorten <= 0.2cm, shorten >= 0.1cm
+ }
+}
+
diff --git a/graphics/pgf/contrib/circuitikz/doc/changelog.tex b/graphics/pgf/contrib/circuitikz/doc/changelog.tex
index 0806a20b78..19a5cd01f3 100644
--- a/graphics/pgf/contrib/circuitikz/doc/changelog.tex
+++ b/graphics/pgf/contrib/circuitikz/doc/changelog.tex
@@ -5,6 +5,38 @@ full list of changes.
\begin{itemize}
\item
+ Version 1.7.0 (2024-08-03)
+
+ There are no big changes here, but the change to the resistor code
+ (maybe one of the most used by the package) well deserves a minor
+ version bump. A couple of new components, and several minor fixes.
+
+ \begin{itemize}
+ \tightlist
+ \item
+ New component: new kind of current tap (suggested by
+ \href{https://github.com/circuitikz/circuitikz/issues/807}{EEpchi
+ and Dr4UX on GitHub})
+ \item
+ New arrow tip \texttt{Jack\ Tap} to help drawing jack connectors
+ (suggested by
+ \href{https://github.com/circuitikz/circuitikz/issues/806}{Anisio
+ Rogerio Braga})
+ \item
+ Change the drawing of the thermocouple (suggested by
+ \href{https://github.com/circuitikz/circuitikz/issues/811}{Dr4UX on
+ GitHub})
+ \item
+ Change and enhancement to the drawing of the American resistors
+ (triggered by
+ \href{https://github.com/circuitikz/circuitikz/issues/814}{Dr4UX on
+ GitHub}), fixing a long-standing small asymmetry that nobody noticed
+ \item
+ Minor adjustment for joins in \texttt{viscoe} component
+ \item
+ Minor additions (\texttt{rectjoinfill}) and fixes in documentation
+ \end{itemize}
+\item
Version 1.6.9 (2024-05-25)
Several new components and a bug fix for a nasty long-standing bug
@@ -495,7 +527,7 @@ full list of changes.
Robustify some shapes: do not let arrows option pass to the inner
drawing (see
\href{https://tex.stackexchange.com/a/632084/38080}{here} and
- \href{https://matrix.to/\#/!NuxCISwYQJuyWwNsEI:matrix.org/$vQO6luq1F66LJ79dERmaqKI46qMBcjStqYCPi725uZE?via=matrix.org&via=2krueger.de&via=im.f3l.de}{here})
+ \href{https://matrix.to/\#/!NuxCISwYQJuyWwNsEI:matrix.org/$vQO6luq1F66LJ79dERmaqKI46qMBcjStqYCPi725uZE?via=matrix.org\&via=2krueger.de\&via=im.f3l.de}{here})
\item
Add warning about global draw options in the manual
\item
diff --git a/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf b/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
index cc6865c72f..032692e01f 100644
--- a/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
+++ b/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf b/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
index 9f3d2b57e0..023c265d6e 100644
--- a/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
+++ b/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex b/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
index ac116af09e..e0fa8032b1 100644
--- a/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
+++ b/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
@@ -2200,6 +2200,83 @@ For the \texttt{photoresistor} and the two ``flavors'' of the light-dependent re
\end{tikzpicture}
\end{LTXexample}
+\begingroup % protect changes to resistors
+\newcommand\showjoin[1]{%
+\begin{tikzpicture}[scale=4, transform shape]
+ \clip (0.2,-0.05) rectangle (0.6,0.3);
+ \draw[ultra thick] (0,0) to[R, resistors/thickness=#1] ++(2,0);
+\end{tikzpicture}%
+}
+\newcommand{\splat}{\begin{center}\ttfamily\scriptsize\begin{tabular}{cccc}
+ \showjoin{1}&\showjoin{2}&\showjoin{3}&\showjoin{4}\\
+ thickness=1 & thickness=2 & thickness=3 & thickness=4 \\
+ \end{tabular}\end{center}%
+}
+\newcommand{\rdivider}[1]{\begin{tikzpicture}
+ \ctikzset{resistors/thickness=#1}
+ \draw (0,0) node[ground]{} to[V] ++(0,2) to[R] ++(2,0)
+ to[R] ++(0,-2) to[short,-*] (0,0);
+\end{tikzpicture}\qquad}
+\newcommand{\divsplat}[1]{#1\par
+ \begin{center}
+ \rdivider{1}\rdivider{2}\rdivider{3}\rdivider{4}
+\end{center}}
+
+\paragraph{Details of American (``zig-zag'') resistors.\label{sec:zigzag-details}} American (zig-zag) resistors have a little joining problem\footnote{Noticed by \href{https://github.com/circuitikz/circuitikz/issues/811}{user Dr4UX on GitHub} and later \href{https://github.com/circuitikz/circuitikz/discussions/814}{discussed here}.} with the leading wires if the thickness is greater than two. In the following drawing you can see the problem when the thickness grows from 1 to 4.
+
+\splat
+
+Since \texttt{v1.7.0}, one possibility to correct the problem is to change the type of joining of the zig-zag line, using the key \texttt{resistors/zigzag join}, which is a command that by default is void. For example, the following effect is obtained by using
+
+\begin{lstlisting}[numbers=none]
+\ctikzset{resistors/zigzag hook/.code={\pgfsetroundcap}}
+\end{lstlisting}
+{\ctikzset{resistors/zigzag hook/.code={\pgfsetroundcap}}
+\splat}
+
+or you can even go full rounded
+
+\begin{lstlisting}[numbers=none]
+\ctikzset{resistors/zigzag hook/.code={\pgfsetroundcap\pgfsetroundjoin}}
+\end{lstlisting}
+{\ctikzset{resistors/zigzag hook/.code={\pgfsetroundcap\pgfsetroundjoin}}
+\splat}
+
+Another possibility is to add a little horizontal ``stub'' to the shape, with the key \texttt{resistors/zigzag stub} (default \texttt{0}), which will add a first part which is a continuation of the wire:
+\begin{lstlisting}[numbers=none]
+\ctikzset{resistors/zigzag stub=0.05}% this is relative to the resistor's length
+\end{lstlisting}
+{\ctikzset{resistors/zigzag stub=0.05}
+\splat}
+
+\dots or you can just combine all of them as you prefer. With the standard join/cap options, the look of the resistors for thickness from 1 to 4 is shown here:
+
+\ctikzset{american}
+\divsplat{Standard drawing of American resistors}
+\divsplat{With a 5\% stub: \ctikzset{resistors/zigzag stub=0.05}}
+\divsplat{With a 20\% stub: \ctikzset{resistors/zigzag stub=0.2}}
+
+
+\bigskip
+Finally, here is the detailed shape with thickness 2 (red=0, blue=0.05, green=0.2), magnified six times:
+
+\vspace*{2cm}% this vspace fences are needed because the transform canvas wreak havoc with the bbox
+\begin{tikzpicture}[transform canvas={scale=6}]
+ \ctikzset{resistors/zigzag stub=0}
+ \draw[red] (0,0.2) to [resistor, resistors/thickness=4] ++(2,0);
+ \ctikzset{resistors/zigzag stub=0.05}
+ \draw[blue] (0,0.1) to [resistor, resistors/thickness=4] ++(2,0);
+ \ctikzset{resistors/zigzag stub=0.2}
+ \draw[green] (0,0) to [resistor, resistors/thickness=4] ++(2,0);
+ % \draw [very thin](1,0.5) -- (1,-0.5);
+ % \draw [very thin](0,0) -- ++(2,0);
+ % \draw [very thin](0,0.1) -- ++(2,0);
+ % \draw [very thin](0,0.2) -- ++(2,0);
+\end{tikzpicture}
+\vspace*{2cm}
+
+\endgroup % changes to resistors stops here
+
\subsection{Capacitors and inductors: dynamical bipoles}
@@ -2852,9 +2929,9 @@ Notice that the size of the double-circle sources (and of the triple-circle one)
\end{LTXexample}
\paragraph{Waveform symbols.}
-Internal symbols of sinusoidal, triangular and square sources are drawn with the same line thickness as the component by default. You can modify this by setting the key \texttt{sources/symbols/thickness} for independent sources and the corresponding \texttt{csource/...} for dependent ones. The value used here is relative to the component (i.e. the circle) value.
+Internal symbols of sinusoidal, triangular and square sources are drawn with the same line thickness as the component by default. You can modify this by setting the key \texttt{sources/symbol/thickness} for independent sources and the corresponding \texttt{csource/...} for dependent ones. The value used here is relative to the component (i.e. the circle) value.
-Normally the symbol is oriented in the same direction as the line, and rotate rigidly with the component; you can change this orientation using the key \texttt{sources/symbols/rotate} or \texttt{csource/...}. The default value is \texttt{90} which correspond to the ``line'' direction (remember, path components are defined as horizontal ones).
+Normally the symbol is oriented in the same direction as the line, and rotate rigidly with the component; you can change this orientation using the key \texttt{sources/symbol/rotate} or \texttt{csource/...}. The default value is \texttt{90} which correspond to the ``line'' direction (remember, path components are defined as horizontal ones).
If instead of an angle value you use \texttt{auto}, the symbol will be rotated so that the waveform is always vertical, similar to what happens in instruments:
\begin{LTXexample}[varwidth=true]
@@ -3019,12 +3096,44 @@ Sometimes it is better to use a shape for instruments which is very different fr
\footnotetext{Suggested by \texttt{@nobrl} on GitHub}
\circuitdescbip{iloop}{Current loop (symbolic)}{}(left/135/0.2, right/45/0.2, center/-90/0.3, i/30/0.4)
\circuitdescbip{iloop2}{Current loop (real)}{}(left/135/0.2, right/-45/0.2, center/-90/0.3, i+/135/0.4, i-/45/0.4)
+ \circuitdescbip{currtap}{Current tap (probe)\footnotemark}{}(tap/-90/0.2)
+ \footnotetext{Suggested by \href{https://github.com/circuitikz/circuitikz/issues/807}{user EEpchi on GitHub}.}
\end{groupdesc}
\subsubsection{Instruments customizations}\label{sec:tweak-instruments}
You can change the scale of all the instruments (including the current loops) by setting the key \texttt{instruments/scale} to something different from the default \texttt{1.0}.
+\paragraph{Current probes.}
+You can change the inner dot in several way, by changing the following keys under the \verb!\ctikzset! key \texttt{bipoles/currtap}:
+\begin{center}
+ \begin{tabular}{>{\ttfamily}l>{\ttfamily}lp{0.7\linewidth}}
+ \toprule
+ parameter & default & description \\
+ \midrule
+ thickness & default & Set the thickness of the line (\texttt{default}: do not change the class thickness) \\
+ color & default & stroke color: \texttt{default} is the same as the component \\
+ dash & default & dash pattern: none means solid line, default means keep the global pattern\footnotemark \\
+ fill & default & fill the inner dot; \texttt{default} means use the wire color, \texttt{none} do not fill, other keys must be a valid color \\
+ dot size& 0.5 & relative size of the inner dot \\
+ \bottomrule
+ \end{tabular}
+ \footnotetext{Follows the syntax of the pattern sequence \texttt{\textbackslash pgfsetdash} --- see \TikZ{} manual for details; phase is always zero. Basically you pass pairs of dash-length -- blank-length dimensions, see the examples.}
+\end{center}
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \draw (0,2) to[currtap, bipoles/currtap/fill=none, *-]
+ ++(2,0) to[currtap, bipoles/currtap/.cd,
+ fill=yellow, color=red, thickness=3,
+ dash={{1.14pt}{2pt}}] ++(2,0);
+ \draw (0,0) to[currtap=I, *-, name=ct] ++(2,0)
+ to[currtap, -*, name=ct2,
+ bipoles/currtap/dot size=0.3] ++(2,0);
+ \draw (ct.tap) -- ++(0,-1) (ct2.tap) -- ++(0,-1);
+\end{circuitikz}
+\end{LTXexample}
+
\paragraph{Oscilloscope waveform.} You can change the waveform shown in the oscilloscope ``screen''\footnote{Suggested by \href{https://tex.stackexchange.com/q/595062/38080}{Mario Tafur on TeX.SX}}. To change it, you just set the key \texttt{bipoles/oscope/waveform} to one of the available shape. You have available the shapes in the following list (the default is \texttt{ramps}):
\begin{LTXexample}[pos=t, basicstyle=\small\ttfamily]
@@ -3478,9 +3587,9 @@ While the horizontal line will be drawn with the current path values, you can ch
\end{circuitikz}
\end{LTXexample}
-\subsection{Arrows}\label{sec:arrows}
+\subsection{Arrows (fake and real)}\label{sec:arrows}
-These are pseudo-arrows used in lot of places in the packages (for transistors, flows, currents, and so on). The first three arrows are magnified by a factor~3 in the boxes below; for the \texttt{trarrow}, the anchor \texttt{tip} is exactly on the tip and \texttt{btip} is slightly receded.
+The main arrow shapes in \Circuitikz{} are really shapes, used as pseudo-arrows in lot of places in the packages (for transistors, flows, currents, and so on). The first three arrows are magnified by a factor~3 in the boxes below; for the \texttt{trarrow}, the anchor \texttt{tip} is exactly on the tip and \texttt{btip} is slightly receded.
\begin{groupdesc}
\circuitdesc[3]{currarrow}{Arrow for current and voltage}{}(center/0/0.2)
@@ -3540,6 +3649,30 @@ The arrows are the ones set with the keys \texttt{tunable start arrow} and \text
Notice also the need to force a transparency group if you want a semitransparent arrow.
+\subsubsection{Arrow tips}\label{sec:arrow-tips}
+
+In addition to the pseudo-arrows, \Circuitikz{} also adds a couple of ``real'' arrow tips.
+The package automatically loads the \texttt{arrows.meta} \TikZ{} library but \emph{not} the deprecated \texttt{arrows} library; in the first versions of the package it used quite a lot the \texttt{latex'} tip, which is not available anymore. To maintain the backward compatibility, the `latexslim` tip has been added, and used by default in several components. This is an old-style arrow tip, with no customization possible.
+
+The other tip is \texttt{Jack Tap}\footnote{Added after a suggestion from \href{https://github.com/circuitikz/circuitikz/issues/806}{Anisio Rogerio Braga} on GitHub}, which is mainly used to build jack connectors (see section~\ref{sec:jacks}). This is a new-style arrow tip, and accepts the parameter \texttt{length} (default \texttt{0.3 cm}), \texttt{width} (default \texttt{0.15 cm}), and the boolean \texttt{swap}.
+
+
+\begin{LTXexample}[varwidth=true]
+\begin{circuitikz}
+ \draw (0,.25) (0,0) edge[-latexslim] ++(1,0)
+ ++(0, -0.5) edge[-{Jack Tap[swap]}] ++(1,0)
+ ++(0, -0.5) edge[-Jack Tap] ++(1,0)
+ ++(0, -0.5) edge[-{Jack Tap[fill=cyan]}] ++(1,0)
+ ++(0, -0.5) edge[-{Jack Tap[width=.3cm,fill]}]++(1,0)
+ ++(0, -0.5) edge[-{Jack Tap[width=.3cm,line join=round,
+ line cap=round]}, thick] ++(1,0)
+ ++(0, -0.5) edge[^-^f] ++(1,0)
+ ++(0, -0.5) edge[vf-v] ++(1,0);
+\end{circuitikz}
+\end{LTXexample}
+You can also have a filled version, by adding the key \texttt{fill} (without arguments\footnote{This usage of the \texttt{fill} key in arrow tips will be added to \TikZ{} in version \texttt{3.1.11}, see \href{https://github.com/pgf-tikz/pgf/pull/1352}{this PR by Henri Menke}; \Circuitikz{} will add it to older versions.}) or \texttt{fill=color} if you want a color different from the stroke ones, and they accept the \texttt{line join} and \texttt{line cap} as most of the standard \TikZ{} arrows.
+As you can see, the normal and swapped \texttt{Jack Tap} tips have the shorthands \texttt{v} and \verb|^| (and \texttt{vf} and \verb|^f| for their filled counterparts). Notice that the tips are automatically reversed when they are at the \emph{start} of the path.
+
\subsection{Terminal shapes}\label{sec:terminals}
These are the so-called ``bipole nodes'' shapes, or poles (see section~\ref{sec:bipole-nodes}). These nodes are always filled; the ``open'' versions (starting with an \texttt{o}) are by default filled with the color specified by the key \texttt{open nodes fill} (by default \texttt{white}), but you can override locally it with the \texttt{fill} parameter.
@@ -3553,6 +3686,12 @@ These are the so-called ``bipole nodes'' shapes, or poles (see section~\ref{sec:
\circuitdesc{osquarepole}{Open square-shape terminal}{}
\end{groupdesc}
+This is not a pole, but it's used to "fill" nasty corners (look closer, and see ~\ref{sec:line-joins}).
+
+\begin{groupdesc}
+ \circuitdesc{rectjoinfill}{Filling square with line width size}{}
+\end{groupdesc}
+
Since version 0.9.0, ``bipole nodes'' shapes have all the standard geographical anchors, so you can do things like these:
\begin{LTXexample}[varwidth=true]
@@ -3672,6 +3811,33 @@ You can use the \texttt{plug center} anchor to add the IEC ``multiplier'':
\end{circuitikz}
\end{LTXexample}
+\subsubsection{Jack connectors}\label{sec:jacks}
+
+There are \emph{lots} of different jack connectors symbols --- see the \href{https://github.com/circuitikz/circuitikz/issues/806}{discussion here} for examples. So instead of creating a monster component, it has been decided to add elements to simplify the drawing of such connectors. The first (and for now only) such element is the \texttt{Jack Tap} arrow tip (see section~\ref{sec:arrow-tips}) with its shorthands \texttt{v} and \verb|^|.
+
+For example, and audio jack can be drawn like this:
+
+\begin{LTXexample}[pos=t, varwidth=true]
+% drawing based on one by Anisio Rogerio Braga
+% https://github.com/circuitikz/circuitikz/issues/806
+\newcommand\dx{1.5}\newcommand\dy{1}
+\begin{circuitikz}
+ \draw[-v] (0,\dy/3*4) to[short, o-] ++(\dx,0);
+ \draw[-Triangle] (0,\dy) node[ocirc]{} -| ++(\dx/3,\dy/3);
+ \draw[-Triangle] (0,\dy/3*2) node[ocirc]{} -| ++(\dx/3,-\dy/3);
+ \draw[-^] (0,\dy/3) to[short, o-] ++(2*\dx/3,0);
+ \draw (0,0.0) to[short, o-] ++(1.75*\dx,0) rectangle ++(0.2,4*\dy/3);
+\end{circuitikz}\qquad\qquad
+%---% audio jack with an inserted plug
+\begin{circuitikz}
+ \draw[-v] (0,\dy/3*4) to[short, o-] ++(\dx,0.2);
+ \draw[-Triangle] (0,\dy) node[ocirc]{} -| ++(\dx/3,\dy/3);
+ \draw[-Triangle] (0,\dy/3*2) node[ocirc]{} -| ++(\dx/3,-\dy/3);
+ \draw[-^] (0,\dy/3) to[short, o-] ++(2*\dx/3,-0.2);
+ \draw (0,0.0) to[short, o-] ++(1.75*\dx,0) rectangle ++(0.2,4*\dy/3);
+\end{circuitikz}
+\end{LTXexample}
+
\subsection{Block diagram components}
\noindent Contributed by Stefan Erhardt.
@@ -6596,7 +6762,7 @@ with the parameter \texttt{number inputs} :
\end{circuitikz}
\end{LTXexample}
-You can suppress the drawing of the logic ports input leads by using the boolean key \texttt{logic ports draw input leads} (default \texttt{true}) or, locally, with the style \texttt{no inputs leads} (that can be reverted with \texttt{input leads}), like in the following example. The anchors do not change and you have to take responsibility to make the connection to the ``border''-anchors.
+You can suppress the drawing of the logic ports input leads by using the boolean key \texttt{logic ports draw input leads} (default \texttt{true}) or, locally, with the style \texttt{no input leads} (that can be reverted with \texttt{input leads}), like in the following example. The anchors do not change and you have to take responsibility to make the connection to the ``border''-anchors.
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
@@ -7436,9 +7602,9 @@ External pins' length is controlled by the key \texttt{multipoles/external pins
like in chips. In addition, like in logic ports, you can suppress the
drawing of the leads by using the boolean key
\texttt{logic ports draw input leads} (default \texttt{true}) or, locally,
-with the style \texttt{no inputs leads} (that can be reverted with
+with the style \texttt{no input leads} (that can be reverted with
\texttt{input leads}).
-The main difference between setting \texttt{external pins width} to \texttt{0} or using \texttt{no inputs lead} is that in the first case the normal pin anchors and the border anchors will coincide, and in the second case they will not move and stay where they should have been if the leads were drawn.
+The main difference between setting \texttt{external pins width} to \texttt{0} or using \texttt{no input lead} is that in the first case the normal pin anchors and the border anchors will coincide, and in the second case they will not move and stay where they should have been if the leads were drawn.
You can draw only selected pins and leave out the rest by setting the keys
\texttt{multipoles/draw only \emph{side} pins} and the corresponding style
@@ -7840,7 +8006,7 @@ You can, if you want, avoid printing the numbers of the pin with \texttt{hide nu
\end{LTXexample}
-Also, you can suppress the drawing of the pins, by using the style \texttt{no inputs leads} (that can be reverted with \texttt{input leads}). The main difference between setting \texttt{external pins width} to \texttt{0} or using \texttt{no inputs lead} is that in the first case the normal pin anchors and the border anchors will coincide, and in the second case they will not move and stay where they should have been if the leads were drawn.
+Also, you can suppress the drawing of the pins, by using the style \texttt{no input leads} (that can be reverted with \texttt{input leads}). The main difference between setting \texttt{external pins width} to \texttt{0} or using \texttt{no input lead} is that in the first case the normal pin anchors and the border anchors will coincide, and in the second case they will not move and stay where they should have been if the leads were drawn.
For special use you can suppress the orientation mark with the key \texttt{no topmark} (default \texttt{topmark}).
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
index afa91d4b2b..4f5ce00a0f 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
@@ -16,8 +16,8 @@
\providecommand\DeclareRelease[3]{}
\providecommand\DeclareCurrentRelease[2]{}
-\def\pgfcircversion{1.6.9}
-\def\pgfcircversiondate{2024/05/25}
+\def\pgfcircversion{1.7.0}
+\def\pgfcircversiondate{2024/08/03}
\DeclareRelease{0.4}{2012/12/20}{circuitikz-0.4-body.tex}
\DeclareRelease{v0.4}{2012/12/20}{circuitikz-0.4-body.tex}
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
index 943745bf7a..cca735bf1e 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
@@ -266,6 +266,58 @@
%
%>>>
+%% check loaded TikZ/pgf version %<<<`
+%
+% parse the release date, thanks to Skillmon
+% https://github.com/pgf-tikz/pgf/issues/1348#issuecomment-2231681032
+% date can be yyyy-mm-dd or (older TikZ) yyyy/mm/dd
+\begingroup
+ \pgfutil@protected\def\parsedate#1%
+ {%
+ \afterassignment\parsedate@month
+ \pgf@circ@count@a=#1\relax
+ }
+ \pgfutil@protected\def\parsedate@month#1%
+ {%
+ \afterassignment\parsedate@day
+ \pgf@circ@count@b=%
+ }
+ \pgfutil@protected\def\parsedate@day#1%
+ {%
+ \afterassignment\parsedate@cleanup
+ \pgf@circ@count@c=%
+ }
+ \def\parsedate@cleanup#1\relax{}%
+ \parsedate{\pgfrevisiondate}%
+ \xdef\ctikz@@pgfyear{\the\pgf@circ@count@a}%
+ \xdef\ctikz@@pgfmonth{\the\pgf@circ@count@b}%
+ \xdef\ctikz@@pgfday{\the\pgf@circ@count@c}%
+\endgroup
+% The following code thanks to Skillmon:
+% https://tex.stackexchange.com/a/722570/38080
+% modified by romano to check the date
+\def\ctikz@@ifpgfafter@auxi#1#2%
+ {%
+ \ifnum#1
+ \ctikz@@ifpgfafter@auxii{#2}%
+ \fi
+ }
+\def\ctikz@@ifpgfafter@auxii#1\fi#2\ctikz@@ifpgfafter#3{\fi#1}
+\def\ctikz@@ifpgfafter#1-#2-#3#%
+ {%
+ \ctikz@@ifpgfafter@auxi{\ctikz@@pgfyear>#1}\pgfutil@firstoftwo
+ \ctikz@@ifpgfafter@auxi{\ctikz@@pgfyear<#1}\pgfutil@secondoftwo
+ \ctikz@@ifpgfafter@auxi{\ctikz@@pgfmonth>#2}\pgfutil@firstoftwo
+ \ctikz@@ifpgfafter@auxi{\ctikz@@pgfmonth<#2}\pgfutil@secondoftwo
+ \ctikz@@ifpgfafter@auxi{\ctikz@@pgfday<#3}\pgfutil@secondoftwo
+ \pgfutil@gobble\ctikz@@ifpgfafter\pgfutil@firstoftwo
+ }
+%
+% usage \ctikz@@ifpgfafter 2023-01-16{true}{false}
+% ^^^ no spaces here, braces needed.
+%
+%>>>
+
%% arrow tips macros and utilities %<<<1
% the default arrow is latexslim, which has been ported over old arrows library (deprecated)
@@ -298,9 +350,70 @@
\pgfpathclose
\pgfusepathqfill
}
-
\pgfarrowsdeclarereversed{latexslim reversed}{latexslim reversed}{latexslim}{latexslim}
-
+%% Jack Tap, see
+%% https://github.com/circuitikz/circuitikz/issues/806
+\pgfdeclarearrow{name=Jack Tap,
+ parameters = {%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \ifpgfarrowswap s\fi%
+ \ifpgfarrowopen o\fi%
+ \ifpgfarrowroundjoin j\fi
+ \ifpgfarrowroundcap c\fi%
+ },
+ setup code = {
+ \pgfarrowssettipend{.5\pgfarrowlength}
+ \pgfarrowssetlineend{-.6\pgfarrowlength}
+ \pgfarrowssetvisualbackend{-.6\pgfarrowlength}
+ \pgfarrowssetbackend{-.6\pgfarrowlength}
+ % hull
+ \pgfarrowshullpoint{.5\pgfarrowlength}{0pt}
+ \pgfarrowshullpoint{0pt}{\pgfarrowwidth}
+ \pgfarrowshullpoint{-.6\pgfarrowlength}{0pt}
+ % Saves: Only the length:
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowssavethe\pgfarrowwidth
+ },
+ drawing code = {
+ \pgfsetdash{}{+0pt}
+ \pgfarrowlinewidth=\pgflinewidth
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \ifpgfarrowroundcap\pgfsetroundcap\else\pgfsetbuttcap\fi
+ \pgfpathmoveto{\pgfqpoint{-.6\pgfarrowlength}{0pt}}
+ \pgfpathlineto{\pgfqpoint{-.5\pgfarrowlength}{0pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfarrowwidth}}
+ \pgfpathlineto{\pgfqpoint{.5\pgfarrowlength}{0pt}}
+ \ifpgfarrowopen
+ \pgfusepathqstroke
+ \else
+ \pgfpathclose
+ \ifdim\pgfarrowlinewidth>0pt\pgfusepathqfillstroke\else\pgfusepathqfill\fi
+ \fi
+ },
+ defaults = {length = 0.3cm, width=0.15cm, open},
+ % cache=false, % breaks everything
+}
+% the new "fill without arg" will be in TikZ 3.1.11. Apply it here if we have an
+% older version
+\ctikz@@ifpgfafter 2023-01-16{\relax}{%
+ % thanks @muzimuzhi https://github.com/pgf-tikz/pgf/issues/1348#issuecomment-2229075269
+ % undo the fill/.value required key
+ \expandafter\let\csname pgfk@/pgf/arrow keys/fill/.@def\endcsname\@undefined
+ \pgfkeys{/pgf/arrow keys/fill/.code={%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgf@nonetext%
+ \pgfarrowsaddtooptions{\pgfarrowopentrue}%
+ \else\ifx\pgf@temp\pgfkeysnovalue@text%
+ \pgfarrowsaddtooptions{\pgfarrowopenfalse}%
+ \else
+ \pgfarrowsaddtooptions{\pgfarrowopenfalse\def\pgf@arrows@fill@color{#1}}%
+ \fi\fi
+ }}%
+}
+\tikzset{v/.tip={Jack Tap[swap]}, ^/.tip={Jack Tap},
+ vf/.tip={Jack Tap[swap,fill]}, ^f/.tip={Jack Tap[fill]}}
+%
% select the arrows using available defaults.
\def\pgfcirc@arrow@default{default}
% choose the arrows to use. Use #2 and #3 if the key is equal to "default"
@@ -466,7 +579,30 @@
\fi
\fi
}
-
+% similar o the above, use the fill parameter to set fill or draw
+% for a subset of the shape
+\def\pgf@circ@subset@fill@or@draw#1{%
+ % You *must* be sure that this is called inside a \pgfscope!
+ \edef\@@none{none}\edef\@@default{default}
+ \edef\@@tmp{\ctikzvalof{#1/fill}}
+ \ifx\@@tmp\@@none
+ \pgfusepath{draw}
+ \else
+ \ifx\@@tmp\@@default\else
+ \pgfsetfillcolor{\@@tmp}
+ \fi
+ \pgfusepath{draw, fill}
+ \fi
+}
+% ...and for the thickness
+\def\pgf@circ@subset@thickness#1{%
+ % You *must* be sure that this is called inside a \pgfscope!
+ \edef\@@default{default}
+ \edef\@@tmp{\ctikzvalof{#1/thickness}}
+ \ifx\@@tmp\@@default\else
+ \pgfsetlinewidth{\@@tmp\pgflinewidth}%
+ \fi
+}
% set the text color (via \color) if the color is not default or none
% needed in some strange case (like bodydiode' dots)
\def\pgf@circ@maybe@color#1{%
@@ -557,6 +693,7 @@
% #7 - macros drawing the bipole
%
\long\def\pgfcircdeclarebipolescaled#1#2#3#4#5#6#7{
+ % \typeout{Declaring bipole:\space #4,}
\pgfdeclareshape{#4shape}{
\savedmacro{\ctikzclass}{\edef\ctikzclass{#1}}
\saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}}
@@ -602,97 +739,33 @@
\pgf@y=.5\pgf@y
}
\anchor{center}{\pgfpointorigin}
- \anchor{n}{
- \northeast
- \pgf@x=0cm
- }
- \anchor{north east}{
- \northeast
- }
- \anchor{north west}{
- \northeast
- \pgf@x=-\pgf@x
- }
- \anchor{ne}{
- \northeast
- }
- \anchor{nw}{
- \northeast
- \pgf@x=-\pgf@x
- }
- \anchor{e}{
- \northeast
- \pgf@y=0cm
- }
- \anchor{s}{
- \southwest
- \pgf@x=0cm
- }
- \anchor{south east}{
- \southwest
- \pgf@x=-\pgf@x
- }
- \anchor{south west}{
- \southwest
- }
- \anchor{se}{
- \southwest
- \pgf@x=-\pgf@x
- }
- \anchor{sw}{
- \southwest
- }
- \anchor{w}{
- \southwest
- \pgf@y=0cm
- }
- \anchor{north}{
- \northeast
- \pgf@x=0cm
- }
- \anchor{east}{
- \northeast
- \pgf@y=0cm
- }
- \anchor{south}{
- \southwest
- \pgf@x=0cm
- }
- \anchor{west}{
- \southwest
- \pgf@y=0cm
- }
- \anchor{right}{
- \northeast
- \pgf@y=0cm
- }
- \anchor{above}{
- \northeast
- \pgf@x=0cm
- }
- \anchor{left}{
- \southwest
- \pgf@y=0cm
- }
- \anchor{below}{
- \southwest
- \pgf@x=0cm
- }
- \anchor{a}{
- \northeast
- \pgf@y=0cm
- }
- \anchor{b}{
- \southwest
- \pgf@y=0cm
- }
+ \anchor{n}{\northeast\pgf@x=0cm }
+ \anchor{north east}{\northeast}
+ \anchor{north west}{\northeast\pgf@x=-\pgf@x}
+ \anchor{ne}{\northeast}
+ \anchor{nw}{\northeast\pgf@x=-\pgf@x}
+ \anchor{e}{\northeast\pgf@y=0cm }
+ \anchor{s}{\southwest\pgf@x=0cm }
+ \anchor{south east}{\southwest\pgf@x=-\pgf@x}
+ \anchor{south west}{\southwest}
+ \anchor{se}{\southwest\pgf@x=-\pgf@x}
+ \anchor{sw}{\southwest}
+ \anchor{w}{\southwest\pgf@y=0cm }
+ \anchor{north}{\northeast\pgf@x=0cm }
+ \anchor{east}{\northeast\pgf@y=0cm }
+ \anchor{south}{\southwest\pgf@x=0cm }
+ \anchor{west}{\southwest\pgf@y=0cm }
+ \anchor{right}{\northeast\pgf@y=0cm }
+ \anchor{above}{\northeast\pgf@x=0cm }
+ \anchor{left}{\southwest\pgf@y=0cm }
+ \anchor{below}{\southwest\pgf@x=0cm }
+ \anchor{a}{\northeast\pgf@y=0cm }
+ \anchor{b}{\southwest\pgf@y=0cm }
\savedanchor{\textanchor}{%
\pgf@y=\ht\pgfnodeparttextbox
\pgf@x=-.5\wd\pgfnodeparttextbox
}
- \anchor{text}{
- \textanchor
- }
+ \anchor{text}{ \textanchor }
\anchorborder{%
\ifpgf@circuit@bipole@inverted
\pgf@circ@res@left=-\pgf@x
@@ -711,7 +784,6 @@
#2%
\pgf@circ@draw@component{
\pgf@circ@setcolor
-
\northeast
\pgf@circ@res@up = \pgf@y
\pgf@circ@res@zero = 0cm
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex
index 626ed28812..b30e741458 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex
@@ -632,13 +632,21 @@
\pgfusepath{draw}
\endpgfscope
}%
-
%% Zig-zag resistors
+% see https://github.com/circuitikz/circuitikz/discussions/814
+\ctikzset{resistors/zigzag stub/.initial=0}
+\ctikzset{resistors/zigzag hook/.code={}}
\def\pgf@circ@zigzag#1{%
+ \pgf@circ@res@temp=\ctikzvalof{resistors/zigzag stub}\pgf@circ@res@step
+ \advance \pgf@circ@res@step by -2\pgf@circ@res@temp
\divide \pgf@circ@res@step by \numexpr4*\zigs\relax
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{\pgf@circ@res@zero}}
+ \ifdim\pgf@circ@res@temp>0pt
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@left+\pgf@circ@res@temp -\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{\pgf@circ@res@zero}}
+ \fi
\pgf@circ@res@other = \pgf@circ@res@left
+ \advance\pgf@circ@res@other by \pgf@circ@res@temp
\pgf@circ@count@a=\zigs\relax
% first half zig
\advance\pgf@circ@res@other by \pgf@circ@res@step
@@ -655,11 +663,14 @@
\advance\pgf@circ@res@other by 2\pgf@circ@res@step
\pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{#1\pgf@circ@res@down}}
\advance\pgf@circ@res@other by \pgf@circ@res@step
- \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@zero}}
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@other+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{\pgf@circ@res@zero}}
+ \ifdim\pgf@circ@res@temp>0pt
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@other+\pgf@circ@res@temp+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{\pgf@circ@res@zero}}
+ \fi
\pgfsetbeveljoin
+ \pgfkeys{/tikz/circuitikz/resistors/zigzag hook}
\pgfusepath{draw}
}
-
%% Resistor
\pgfcircdeclarebipolescaled{resistors}
{
@@ -672,7 +683,7 @@
{
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgftransformationadjustments
- \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/resistor/width}*\scaledRlen+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}
+ \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/resistor/width}*\scaledRlen}
\pgf@circ@zigzag{1}
}
@@ -692,7 +703,7 @@
{
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgftransformationadjustments
- \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/vresistor/width}*\scaledRlen+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}
+ \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/vresistor/width}*\scaledRlen}
\pgf@circ@zigzag{.5}
\pgfscope
@@ -731,7 +742,7 @@
{
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgftransformationadjustments
- \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/potentiometer/width}*\scaledRlen+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}
+ \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/potentiometer/width}*\scaledRlen}
\pgf@circ@zigzag{1}
\pgfscope
@@ -761,7 +772,7 @@
{%
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgftransformationadjustments
- \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/resistivesens/width}*\scaledRlen+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}
+ \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/resistivesens/width}*\scaledRlen}
\pgf@circ@zigzag{.5}
\pgfscope
@@ -810,7 +821,7 @@
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@right/\@@intscale+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{+0pt}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{+0pt}}
\pgftransformationadjustments
- \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/ldresistor/width}*\scaledRlen+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}
+ \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/ldresistor/width}*\scaledRlen}
\pgf@circ@zigzag{\@@hscale}
}%
@@ -6031,6 +6042,13 @@
\ctikzset{bipoles/qpprobe/voltage/additional shift/.initial=.5}
\ctikzset{bipoles/iloop/width/.initial=.40}
\ctikzset{bipoles/iloop/height/.initial=.60}
+% currtap see https://github.com/circuitikz/circuitikz/issues/807
+\ctikzset{bipoles/currtap/height/.initial=0.4}
+\ctikzset{bipoles/currtap/dot size/.initial=0.5}
+\ctikzset{bipoles/currtap/fill/.initial=default}
+\ctikzset{bipoles/currtap/dash/.initial=none}
+\ctikzset{bipoles/currtap/color/.initial=default}
+\ctikzset{bipoles/currtap/thickness/.initial=default}
\ctikzset{bipoles/oscope/height/.initial=.60}
\ctikzset{bipoles/oscope/width/.initial=.60}
@@ -6607,6 +6625,28 @@
\pgfusepath{draw}
\endpgfscope
}
+%% currtap
+\pgfcircdeclarebipolescaled{instruments}
+{
+ \savedmacro{\@@dotsize}{\def\@@dotsize{\ctikzvalof{bipoles/currtap/dot size}}}
+ \anchor{tap}{\northeast\pgf@x=0pt\pgf@y=\@@dotsize\pgf@y\pgf@y=-\pgf@y}
+}
+{\ctikzvalof{bipoles/currtap/height}}
+{currtap}
+{\ctikzvalof{bipoles/currtap/height}}
+{\ctikzvalof{bipoles/currtap/height}}
+{
+ \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}}
+ \pgfpathlineto{\pgfpoint{0.95\pgf@circ@res@left}{0pt}}
+ \pgfpatharc{180}{0}{0.95\pgf@circ@res@right}
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{0pt}}
+ \pgfusepath{draw}
+ \pgf@circ@subset@color@dash{bipoles/currtap}
+ \pgf@circ@subset@thickness{bipoles/currtap}
+ \pgfusepath{draw}
+ \pgfpathcircle{\pgfpoint{0pt}{0pt}}{\@@dotsize*\pgf@circ@res@up}
+ \pgf@circ@subset@fill@or@draw{bipoles/currtap}
+}
% %>>>
% Path definitions for Instruments%<<<
@@ -6619,8 +6659,8 @@
\pgfcirc@activate@bipole@simple{l}{rmeterwa}
\pgfcirc@activate@bipole@simple{l}{smeter}
\pgfcirc@activate@bipole@simple{l}{iloop}
-% \pgfcirc@activate@bipole@simple{l}{iloop2} that was wrong
\pgfcirc@activate@bipole{l}{ilooptwo}{iloop2}{iloop2}
+\pgfcirc@activate@bipole@simple{l}{currtap}
\pgfcirc@activate@bipole@simple{l}{qvprobe}
\pgfcirc@activate@bipole@simple{l}{qiprobe}
\pgfcirc@activate@bipole@simple{l}{qpprobe}
@@ -6774,16 +6814,22 @@
% spring into the damper
\pgfscope
- \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@zero}}
+ \pgfscope
+ \pgftransformationadjustments
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
+ \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{\pgf@circ@res@zero}}
+ \pgfpathlineto{\pgfpoint{.95\pgf@circ@res@left}{\pgf@circ@res@zero}}
\pgfsetcornersarced{\pgfpoint{.25\pgf@circ@res@up}{.25\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{.75\pgf@circ@res@left}{.75\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{.5\pgf@circ@res@left}{-.75\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{.25\pgf@circ@res@left}{.75\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{0pt}{-.75\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{\ctikzvalof{bipoles/damper/length}\pgf@circ@res@right}{.75\pgf@circ@res@up}}
+ \pgfsetbuttcap
+ \pgfsetbeveljoin
\pgfusepath{stroke}
\endpgfscope
+ \endpgfscope
% damper box
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@down}}
@@ -7171,18 +7217,18 @@
{\ctikzvalof{bipoles/thermocouple/height}}
{\ctikzvalof{bipoles/thermocouple/width}}
{
+ \pgfsetrectcap
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{.5\pgf@circ@res@down}}
- \pgfusepath{draw}
- \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{.5\pgf@circ@res@down}}
- \pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgfpathlineto{\pgfpoint{0}{\pgf@circ@res@down}}
- \pgfusepath{draw}
- \pgfsetlinewidth{\pgfstartlinewidth}
- \pgfpathmoveto{\pgfpoint{0}{\pgf@circ@res@down}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{.5\pgf@circ@res@down}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{0}}
\pgfusepath{draw}
+ \pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
+ \pgfsetroundcap
+ \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{.5\pgf@circ@res@down}}
+ \pgfpathlineto{\pgfpoint{0}{\pgf@circ@res@down}}
+ \pgfusepath{draw}
}
%% fuse
\pgfcircdeclarebipolescaled{misc}
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
index e3665b8862..cb95f54ef3 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
@@ -231,13 +231,15 @@
\compattikzset{#2/.style={\comnpatname #1, #3={##1}}}%
}
% create a bipole
-\def\pgfcirc@activate@bipole#1#2#3#4{% path name, base node name, style name
+\def\pgfcirc@activate@bipole#1#2#3#4{% type of label, path name, base node name, style name
+ % \typeout{Activate bipole:\space #4,}
\expandafter\def\csname pgf@circ@#2@path\endcsname##1{\pgf@circ@bipole@path{#3}{##1}}%
\pgfcirc@path@to@style{#1}{#2}{#4}{}% no options here, let's see
}
\def\pgfcirc@activate@bipole@simple#1#2{\pgfcirc@activate@bipole{#1}{#2}{#2}{#2}}
% create a bipole with options
-\def\pgfcirc@activate@bipole@opt#1#2#3#4#5{% path name, base node name, style name
+\def\pgfcirc@activate@bipole@opt#1#2#3#4#5{% type of label, path name, base node name, style name, options
+ % \typeout{Activate bipole:\space #4,}
\expandafter\def\csname pgf@circ@#2@path\endcsname##1{\pgf@circ@bipole@path{#3}{##1}}%
\pgfcirc@path@to@style{#1}{#2}{#4}{#5}% no options here, let's see
}
diff --git a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
index 4e4861071f..f85b8ab58b 100644
--- a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
@@ -16,8 +16,8 @@
\startmodule[circuitikz]
\usemodule[tikz]
-\def\pgfcircversion{1.6.9}
-\def\pgfcircversiondate{2024/05/25}
+\def\pgfcircversion{1.7.0}
+\def\pgfcircversiondate{2024/08/03}
\writestatus{loading}{\pgfcircversiondate{} The CircuiTikz circuit drawing package version \pgfcircversion}
diff --git a/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.pdf b/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.pdf
index bf929693ef..aa999d601b 100644
--- a/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.pdf
+++ b/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.tex b/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.tex
index b05a67fe68..f3c60c9d00 100644
--- a/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.tex
+++ b/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.tex
@@ -1,13 +1,16 @@
% !TeX TXS-program:compile = txs:///arara
-% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode}
-% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
+% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode}
+% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
\documentclass[french,a4paper,11pt]{article}
\usepackage[margin=2cm,includefoot]{geometry}
-\def\TPversion{0.1.5}
-\def\TPdate{13 décembre 2023}
+\def\TPversion{0.1.6}
+\def\TPdate{29 août 2024}
+\usepackage{amssymb}
\usepackage[table,svgnames]{xcolor}
-\usepackage[bold-style=ISO,math-style=french]{concmath-otf}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+%\usepackage[bold-style=ISO,math-style=french]{concmath-otf}
%\usepackage[bold-style=ISO,math-style=french]{unicode-math}
%\setmainfont{TeX Gyre Schola}
%\setmathfont{TeX Gyre Schola Math}
@@ -91,8 +94,8 @@
\newcommand\affichegrille[4]{%
\draw[xstep=1,ystep=1,lightgray] (#1,#3) grid (#2,#4) ;
- \foreach \x in {#1,\inteval{1+#1},...,#2} \draw[lightgray] (\x,#4)--++(0,3pt) node[font=\scriptsize,above] {$\x$} ;
- \foreach \y in {#3,\inteval{1+#3},...,#4} \draw[lightgray] (#1,\y)--++(-3pt,0) node[font=\scriptsize,left] {$\y$} ;
+ \foreach \x in {#1,\inteval{1+#1},...,#2} {\draw[lightgray] (\x,#4)--++(0,3pt) node[font=\scriptsize,above] {$\x$} ;}
+ \foreach \y in {#3,\inteval{1+#3},...,#4} {\draw[lightgray] (#1,\y)--++(-3pt,0) node[font=\scriptsize,left] {$\y$} ;}
}
\newcommand\pointsutiles[1]{%
\foreach \point in {#1} {\draw[thick,fill=red] \point circle[radius=3pt] ;}
@@ -170,7 +173,7 @@
\vfill
-\hfill\textit{Merci à Arnaud pour ses retours et idées !!}
+\hfill\textit{Merci à Arnaud et Cyril pour leurs retours et idées !!}
\vfill
@@ -197,7 +200,9 @@
\part{Historique}
-\verb|v0.1.4 : |Modification de la graduation intérieure pour les rapporteurs 180°
+\verb|v0.1.6 : |Correction d'un bug avec une compilation en \textsf{pdflatex} + Améliorations pour les rotations des labels
+
+\verb|v0.1.5 : |Modification de la graduation intérieure pour les rapporteurs 180°
\verb|v0.1.4 : |Possibilité de positionner certains outils avec deux points (angle calculé automatiquement)
@@ -288,10 +293,8 @@ Les différents outils disponibles ont \textit{grosso-modo} le même mode de fon
\item pour certains outils, des dimensions minimales sont requises pour un aspect acceptable ;
\item les options personnalisables sont (sauf exceptions) :
\begin{itemize}
- \item la \textit{taille} ;
- \item l'\textit{échelle} globale ou l'\textit{échelle} des éventuels labels ;
- \item les \textit{couleurs} ;
- \item le \textit{fond} (couleur et opacité) ;
+ \item la \textit{taille}, l'\textit{échelle} globale ou l'\textit{échelle} des éventuels labels ;
+ \item les \textit{couleurs}, le \textit{fond} (couleur et opacité) ;
\item la position (\textit{placement} et/ou \textit{rotation}) ;
\item un \textit{placement automatique} avec la données de 2 points.
\end{itemize}
@@ -326,7 +329,7 @@ Les outils disponibles sont à insérer dans un environnement \TikZ, et pour le
\tkzCompas[clés]{pointe}{mine}
\end{PresentationCode}
-\subsection{Utilisation d'unités}
+\subsection{Utilisation d'unités et/ou de rotations}
\begin{tipblock}
Les outils ont été créés avec unité de base de 1~cm, afin que les graduations soient \textit{en taille réelle}.
@@ -338,6 +341,10 @@ Il est toutefois possible de modifier les unités de l'environnement \TikZ, dans
\smallskip
Ce choix est donc à \textit{réserver} dans l'optique de faire des petits schémas pour illustrer des positions d'outils.
+
+\smallskip
+
+Du fait des rotations effectuées par le code pour correctement placer les objets et les graduations, il est conseillé (même si cela devrait fonctionner) de ne pas trop spécifier de rotation globale pour l'environnement \texttt{tikzpicture}\ldots
\end{tipblock}
\pagebreak
@@ -430,6 +437,7 @@ Quelques \Cle{clés} de personnalisation sont disponibles :
\item \Cle{CouleurFond} pour la couleur du fond de la règle ;\hfill~(défaut : \Cle{black})
\item \Cle{Opacite} pour régler l'opacité du fond de la règle ;\hfill~(défaut : \Cle{0.5})
\item le booléen \Cle{AfficheValeurs} pour afficher les valeurs des graduations ;\hfill~(défaut : \Cle{true})
+ \item \Cle{EchelleValeurs} pour l'échelle (relative) des valeurs ;\hfill~(défaut : \Cle{0.8})
\item \Cle{PosVal} pour spécifier la position (haut, milieu, etc) des valeurs, parmi \Cle{h/m/b/hb}.
\hfill~(défaut : \Cle{m})
@@ -501,6 +509,7 @@ Quelques \Cle{clés} de personnalisation sont disponibles :
\item \Cle{CouleurFond} pour la couleur du fond de la règle-repère ;\hfill~(défaut : \Cle{black})
\item \Cle{Opacite} pour régler l'opacité du fond de la règle-repère ;\hfill~(défaut : \Cle{0.5})
\item le booléen \Cle{AfficheValeurs} pour afficher les valeurs des graduations ;\hfill~(défaut : \Cle{true})
+ \item \Cle{EchelleValeurs} pour l'échelle (relative) des valeurs ;\hfill~(défaut : \Cle{0.8})
\item le booléen \Cle{Retourne} pour \textit{inverser la position des graduations}.
\hfill~(défaut : \Cle{false})
@@ -564,6 +573,7 @@ Quelques \Cle{clés} de personnalisation sont disponibles :
\item \Cle{Origine} pour le placer l'équerre (au niveau du coin) ;\hfill~(défaut : \Cle{\{(0,0)\}})
\item \Cle{Rotation} pour pivoter l'équerre (au niveau du coin) ;\hfill~(défaut : \Cle{0})
\item \Cle{Echelle} pour l'échelle globale de l'équerre ;\hfill~(défaut : \Cle{1})
+ \item \Cle{EchelleValeurs} pour l'échelle (relative) des valeurs ;\hfill~(défaut : \Cle{0.8})
\item \Cle{Couleur} pour la couleur des éléments de l'équerre ;\hfill~(défaut : \Cle{black})
\item le booléen \Cle{Fond} pour afficher une couleur de fond pour l'équerre ;\hfill~(défaut : \Cle{false})
\item \Cle{CouleurFond} pour la couleur du fond de l'équerre ;\hfill~(défaut : \Cle{black})
@@ -749,7 +759,8 @@ Quelques \Cle{clés} de personnalisation sont disponibles :
\item le booléen \Cle{Fond} pour afficher une couleur de fond pour la réquerre ;\hfill~(défaut : \Cle{false})
\item \Cle{CouleurFond} pour la couleur du fond de la réquerre ;\hfill~(défaut : \Cle{black})
\item \Cle{Opacite} pour régler l'opacité du fond de la réquerre ;\hfill~(défaut : \Cle{0.5})
- \item le booléen \Cle{AfficheValeurs} pour afficher les valeurs des graduations.\hfill~(défaut : \Cle{true})
+ \item le booléen \Cle{AfficheValeurs} pour afficher les valeurs des graduations ;\hfill~(défaut : \Cle{true})
+ \item \Cle{EchelleValeurs} pour l'échelle (relative) des valeurs.\hfill~(défaut : \Cle{0.8})
\end{itemize}
À noter que pour la clé \Cle{Rotation}, il est possible de préciser un deuxième point, et dans ce cas la clé sera précisée sous la forme \Cle{Rotation=auto/pt}. Dans \textbf{ce cas}, les points \textit{support} \textbf{devront} avoir été déclarés au préalable !
diff --git a/graphics/pgf/contrib/outilsgeomtikz/tex/OutilsGeomTikz.sty b/graphics/pgf/contrib/outilsgeomtikz/tex/OutilsGeomTikz.sty
index bb79723d21..5f6cd30410 100644
--- a/graphics/pgf/contrib/outilsgeomtikz/tex/OutilsGeomTikz.sty
+++ b/graphics/pgf/contrib/outilsgeomtikz/tex/OutilsGeomTikz.sty
@@ -2,7 +2,8 @@
% licence........: Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{OutilsGeomTikz}[2023/12/13 v0.1.5 Outils geometriques en TikZ]
+\ProvidesPackage{OutilsGeomTikz}[2024/08/29 v0.1.6 Outils geometriques en TikZ]
+% 0.1.6 Correction de bugs avec pdflatex + amélioration de la gestion des rotations/échelles des labels (tks Cyril I. ^^)
% 0.1.5 Modification de la graduation intérieure pour les rapporteurs 180°
% 0.1.4 Possibilité de positionner les outils avec deux points (angle calculé automatiquement)
% 0.1.3 Ajout du pourcenteur
@@ -60,7 +61,8 @@
Origine=\xdef\REGLposOrigin{#1},%
Rotation=\def\REGLangle{#1},%
Opacite=\def\REGLopac{#1},%
- PosVal=\def\REGLposval{#1}
+ PosVal=\def\REGLposval{#1},%
+ EchelleValeurs=\def\REGLechlabel{#1}
}
\setKVdefault[RegleGeom]{%
@@ -74,7 +76,8 @@
AfficheValeurs=true,%
Fond=false,%
Opacite=0.5,%
- PosVal=m
+ PosVal=m,%
+ EchelleValeurs=0.8
}
\NewDocumentCommand{\tkzRegle}{ O{} }{%
@@ -88,7 +91,7 @@
}{}%
\xdef\REGLlongueur{\fpeval{max(3,\REGLlongueur)}}%valeurs mini
\xdef\REGLlargeur{\fpeval{max(1.5,\REGLlargeur)}}
- \begin{scope}[shift={(\REGLposOrigin)},rotate=\REGLangle,scale=\REGLechelle]
+ \begin{scope}[shift={(\REGLposOrigin)},rotate=\REGLangle,scale=\REGLechelle,transform shape]
\ifboolKV[RegleGeom]{Fond}
{%
\begin{scope}
@@ -104,13 +107,13 @@
\ifboolKV[RegleGeom]{AfficheValeurs}%
{%
\IfSubStr{\REGLposval}{h}
- {\foreach \i in {0,1,...,\REGLlongueur} \draw[\REGLcouleur] (\i,{-0.5}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLangle,scale={0.8*\REGLechelle},font=\small,below] {$\i$} ;}
+ {\foreach \i in {0,1,...,\REGLlongueur} {\draw[\REGLcouleur] (\i,{-0.5}) node[inner sep=1pt,outer sep=1pt,scale={\REGLechlabel},font=\small,below] {$\i$} ;}}
{}
\IfSubStr{\REGLposval}{m}
- {\foreach \i in {0,1,...,\REGLlongueur} \draw[\REGLcouleur] (\i,{-0.5*\REGLlargeur}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLangle,scale={0.8*\REGLechelle},font=\small] {$\i$} ;}
+ {\foreach \i in {0,1,...,\REGLlongueur} {\draw[\REGLcouleur] (\i,{-0.5*\REGLlargeur}) node[inner sep=1pt,outer sep=1pt,scale={\REGLechlabel},font=\small] {$\i$} ;}}
{}
\IfSubStr{\REGLposval}{b}
- {\foreach \i in {0,1,...,\REGLlongueur} \draw[\REGLcouleur] (\i,{-\REGLlargeur+0.5}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLangle,scale={0.8*\REGLechelle},font=\small,above] {\rotatebox{180}{$\fpeval{trunc(\REGLlongueur)-\i}$}} ;}
+ {\foreach \i in {0,1,...,\REGLlongueur} {\draw[\REGLcouleur] (\i,{-\REGLlargeur+0.5}) node[inner sep=1pt,outer sep=1pt,scale={\REGLechlabel},font=\small,above] {\rotatebox{180}{$\fpeval{trunc(\REGLlongueur)-\i}$}} ;}}
{}
}%
{}%
@@ -126,7 +129,8 @@
CouleurFond=\def\REGLREPcouleurfond{#1},%
Origine=\def\REGLREPposOrigin{#1},%
Rotation=\def\REGLREPangle{#1},%
- Opacite=\def\REGLREPopac{#1}
+ Opacite=\def\REGLREPopac{#1},%
+ EchelleValeurs=\def\REGLREPechlabel{#1}
}
\setKVdefault[RegleRepereGeom]{%
@@ -140,7 +144,8 @@
AfficheValeurs=true,%
Fond=false,%
Opacite=0.5,%
- Retourne=false
+ Retourne=false,%
+ EchelleValeurs=0.8
}
\NewDocumentCommand{\tkzRegleRepere}{ O{} }{%
@@ -154,7 +159,7 @@
\pgfmathanglebetweenpoints{\pgfpointanchor{\REGLREPposOrigin}{center}}{\pgfpointanchor{\tmppointdeux}{center}}%
\edef\REGLREPangle{\pgfmathresult}%
}{}%
- \begin{scope}[shift={(\REGLREPposOrigin)},rotate=\REGLREPangle,scale=\REGLREPechelle]
+ \begin{scope}[shift={(\REGLREPposOrigin)},rotate=\REGLREPangle,scale=\REGLREPechelle,transform shape]
%bases de la règle-repère
\ifboolKV[RegleRepereGeom]{Fond}%
{\draw[draw=none,fill=\REGLREPcouleurfond!10!white,fill opacity=\REGLREPopac,rounded corners] (-0.5,0) rectangle++ ({\REGLREPlongueur+1},{-\REGLREPlargeur}) ;}%
@@ -175,12 +180,12 @@
{%
\ifboolKV[RegleRepereGeom]{Retourne}%
{%
- {\foreach \i in {0,1,...,\REGLREPlongueur} \draw[\REGLREPcouleur] (\i,{-0.5}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLREPangle,scale={0.8*\REGLREPechelle},font=\small,below] {$\fpeval{-trunc(0.5*\REGLREPlongueur)+\i}$} ;}
- {\foreach \i in {0,1,...,\REGLREPlongueur} \draw[\REGLREPcouleur] (\i,{-\REGLREPlargeur+0.5}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLREPangle,scale={0.8*\REGLREPechelle},font=\small,above] {\rotatebox{180}{$\inteval{\REGLREPlongueur-\i}$}} ;}
+ {\foreach \i in {0,1,...,\REGLREPlongueur} {\draw[\REGLREPcouleur] (\i,{-0.5}) node[inner sep=1pt,outer sep=1pt,scale={\REGLREPechlabel},font=\small,below] {$\fpeval{-trunc(0.5*\REGLREPlongueur)+\i}$} ;}}
+ {\foreach \i in {0,1,...,\REGLREPlongueur} {\draw[\REGLREPcouleur] (\i,{-\REGLREPlargeur+0.5}) node[inner sep=1pt,outer sep=1pt,scale={\REGLREPechlabel},font=\small,above] {\rotatebox{180}{$\inteval{\REGLREPlongueur-\i}$}} ;}}
}%
{%
- {\foreach \i in {0,1,...,\REGLREPlongueur} \draw[\REGLREPcouleur] (\i,{-0.5}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLREPangle,scale={0.8*\REGLREPechelle},font=\small,below] {$\i$} ;}
- {\foreach \i in {0,1,...,\REGLREPlongueur} \draw[\REGLREPcouleur] (\i,{-\REGLREPlargeur+0.5}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLREPangle,scale={0.8*\REGLREPechelle},font=\small,above] {\rotatebox{180}{$\fpeval{trunc(0.5*\REGLREPlongueur)-\i}$}} ;}
+ {\foreach \i in {0,1,...,\REGLREPlongueur} {\draw[\REGLREPcouleur] (\i,{-0.5}) node[inner sep=1pt,outer sep=1pt,scale={\REGLREPechlabel},font=\small,below] {$\i$} ;}}
+ {\foreach \i in {0,1,...,\REGLREPlongueur} {\draw[\REGLREPcouleur] (\i,{-\REGLREPlargeur+0.5}) node[inner sep=1pt,outer sep=1pt,scale={\REGLREPechlabel},font=\small,above] {\rotatebox{180}{$\fpeval{trunc(0.5*\REGLREPlongueur)-\i}$}} ;}}
}%
}
{}%
@@ -196,7 +201,8 @@
CouleurFond=\def\REQcouleurfond{#1},%
Origine=\def\REQposOrigin{#1},%
Rotation=\def\REQangle{#1},%
- Opacite=\def\REQopac{#1}
+ Opacite=\def\REQopac{#1},%
+ EchelleValeurs=\def\REQechlabel{#1}
}
\setKVdefault[RequerreGeom]{%
@@ -209,7 +215,8 @@
Rotation=0,%
AfficheValeurs=true,%
Fond=false,%
- Opacite=0.5
+ Opacite=0.5,%
+ EchelleValeurs=0.8
}
\NewDocumentCommand{\tkzRequerre}{ O{} }{%
@@ -223,7 +230,7 @@
\pgfmathanglebetweenpoints{\pgfpointanchor{\REQposOrigin}{center}}{\pgfpointanchor{\tmppointdeux}{center}}%
\edef\REQangle{\pgfmathresult}%
}{}%
- \begin{scope}[shift={(\REQposOrigin)},rotate=\REQangle,scale=\REQechelle]
+ \begin{scope}[shift={(\REQposOrigin)},rotate=\REQangle,scale=\REQechelle,transform shape]
\ifboolKV[RequerreGeom]{Fond}
{
\fill[draw=none,rounded corners,fill=\REQcouleurfond!10!white,fill opacity=\REQopac] ({-\REQlongueur*0.5},0) rectangle ({\REQlongueur*0.5},{-\REQlargeur}) ;
@@ -243,10 +250,10 @@
\end{scope}
\ifboolKV[RequerreGeom]{AfficheValeurs}%
{%
- \draw[\REQcouleur] (0,-0.5) node[inner sep=1pt,outer sep=1pt,rotate=\REQangle,scale={0.8*\REQechelle},font=\small,below] {$0$} ;
+ \draw[\REQcouleur] (0,-0.5) node[inner sep=1pt,outer sep=1pt,scale={\REQechlabel},font=\small,below] {$0$} ;
\foreach \i in {1,2,...,\fpeval{0.5*\REQlongueur-0.5}}{%
- \draw[\REQcouleur] (\i,-0.5) node[inner sep=1pt,outer sep=1pt,rotate=\REQangle,scale={0.8*\REQechelle},font=\small,below] {$\i$} ;
- \draw[\REQcouleur] (-\i,-0.5) node[inner sep=1pt,outer sep=1pt,rotate=\REQangle,scale={0.8*\REQechelle},font=\small,below] {$-\i$} ;}
+ \draw[\REQcouleur] (\i,-0.5) node[inner sep=1pt,outer sep=1pt,scale={\REQechlabel},font=\small,below] {$\i$} ;
+ \draw[\REQcouleur] (-\i,-0.5) node[inner sep=1pt,outer sep=1pt,scale={\REQechlabel},font=\small,below] {$-\i$} ;}
}%
{}%
\end{scope}
@@ -260,7 +267,8 @@
CouleurFond=\def\EQcouleurfond{#1},%
Origine=\def\EQposOrigin{#1},%
Rotation=\def\EQangle{#1},%
- Opacite=\def\EQopac{#1}
+ Opacite=\def\EQopac{#1},%
+ EchelleValeurs=\def\EQechlabel{#1}
}
\setKVdefault[EquerreGeom]{%
@@ -273,7 +281,8 @@
AfficheValeurs=true,%
Fond=false,%
Opacite=0.5,%
- PetitCote=false
+ PetitCote=false,%
+ EchelleValeurs=0.8
}
\NewDocumentCommand{\tkzEquerre}{ O{} }{%
@@ -293,7 +302,7 @@
\edef\EQangle{\fpeval{\pgfmathresult-90}}%
}%
}{}%
- \begin{scope}[shift={(\EQposOrigin)},rotate=\EQangle,scale=\EQechelle]
+ \begin{scope}[shift={(\EQposOrigin)},rotate=\EQangle,scale=\EQechelle,transform shape]
\ifboolKV[EquerreGeom]{Fond}
{%
\begin{scope} %diff extérieur-intérieur
@@ -318,10 +327,12 @@
\foreach \y in {0,1,...,\fpeval{0.925*\EQlongueur}} {\draw[\EQcouleur] (0,\y)--(0.4,\y) ;}
\ifboolKV[EquerreGeom]{AfficheValeurs}%
{%
- \foreach \i in {1,2,...,\fpeval{0.9*\EQlongueur-1}}
- \draw[\EQcouleur] (0.4,\i) node[inner sep=1pt,outer sep=1pt,rotate=\EQangle,scale={0.8*\EQechelle},font=\small,right] {\rotatebox{90}{$\i$}} ;
- \foreach \i in {1,2,...,\fpeval{0.9*\EQlargeur-0.5}}
- \draw[\EQcouleur] (\i,0.4) node[inner sep=1pt,outer sep=1pt,rotate=\EQangle,scale={0.8*\EQechelle},font=\small,above] {\rotatebox{180}{$\i$}} ;
+ \foreach \i in {1,2,...,\fpeval{0.9*\EQlongueur-1}}{%
+ \draw[\EQcouleur] (0.4,\i) node[inner sep=1pt,outer sep=1pt,scale={\EQechlabel},font=\small,right] {\rotatebox{90}{$\i$}} ;
+ }%
+ \foreach \i in {1,2,...,\fpeval{0.9*\EQlargeur-0.5}}{%
+ \draw[\EQcouleur] (\i,0.4) node[inner sep=1pt,outer sep=1pt,scale={\EQechlabel},font=\small,above] {\rotatebox{180}{$\i$}} ;
+ }%
}%
{}%
\end{scope}
@@ -336,7 +347,8 @@
CouleurFond=\def\RAPPcouleurfond{#1},%
Origine=\def\RAPPposOrigin{#1},%
Rotation=\def\RAPPangle{#1},%
- Opacite=\def\RAPPopac{#1}
+ Opacite=\def\RAPPopac{#1},%
+ EchelleValeurs=\def\RAPPechlabel{#1}
}
\setKVdefault[RapporteurGeom]{%
@@ -350,13 +362,14 @@
Fond=false,%
Opacite=0.5,%
Complet=false,%
- GraduationsInt=false
+ GraduationsInt=false,%
+ EchelleValeurs=0.8
}
\NewDocumentCommand{\tkzRapporteur}{ O{} }{%
\useKVdefault[RapporteurGeom]%
\setKV[RapporteurGeom]{#1}%
- \begin{scope}[shift={(\RAPPposOrigin)},rotate=\RAPPangle,scale=\RAPPechelle,every node/.style={rotate=\RAPPangle}]
+ \begin{scope}[shift={(\RAPPposOrigin)},rotate=\RAPPangle,scale=\RAPPechelle,transform shape]
\ifboolKV[RapporteurGeom]{Complet}
{
%fond
@@ -382,27 +395,27 @@
%valeurs si booléen
\ifboolKV[RapporteurGeom]{AfficheAngles}
{%
- \draw[\RAPPcouleur] (0:2.75) node[rotate=90,scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$0$} ;
- \draw[\RAPPcouleur] (180:3.25) node[rotate=90,scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\pm 180$} ;
- \draw[\RAPPcouleur] (180:2.75) node[rotate=90,scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\pm \pi$} ;
+ \draw[\RAPPcouleur] (0:2.75) node[rotate=90,scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$0$} ;
+ \draw[\RAPPcouleur] (180:3.25) node[rotate=90,scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\pm 180$} ;
+ \draw[\RAPPcouleur] (180:2.75) node[rotate=90,scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\pm \pi$} ;
\foreach \i in {0,10,...,170}
- {\draw[\RAPPcouleur] (\i:3.25) node[rotate={\i-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\i$} ;}
- \draw[\RAPPcouleur] (30:2.75) node[rotate={30-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{6}$} ;
- \draw[\RAPPcouleur] (45:2.75) node[rotate={45-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{4}$} ;
- \draw[\RAPPcouleur] (60:2.75) node[rotate={60-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{3}$} ;
- \draw[\RAPPcouleur] (90:2.75) node[rotate={90-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{2}$} ;
- \draw[\RAPPcouleur] (120:2.75) node[rotate={120-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{2\pi}{3}$} ;
- \draw[\RAPPcouleur] (135:2.75) node[rotate={135-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{3\pi}{4}$} ;
- \draw[\RAPPcouleur] (150:2.75) node[rotate={150-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{5\pi}{6}$} ;
+ {\draw[\RAPPcouleur] (\i:3.25) node[rotate={\i-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\i$} ;}
+ \draw[\RAPPcouleur] (30:2.75) node[rotate={30-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{6}$} ;
+ \draw[\RAPPcouleur] (45:2.75) node[rotate={45-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{4}$} ;
+ \draw[\RAPPcouleur] (60:2.75) node[rotate={60-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{3}$} ;
+ \draw[\RAPPcouleur] (90:2.75) node[rotate={90-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{2}$} ;
+ \draw[\RAPPcouleur] (120:2.75) node[rotate={120-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{2\pi}{3}$} ;
+ \draw[\RAPPcouleur] (135:2.75) node[rotate={135-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{3\pi}{4}$} ;
+ \draw[\RAPPcouleur] (150:2.75) node[rotate={150-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{5\pi}{6}$} ;
\foreach \i in {10,20,...,170}
- {\draw[\RAPPcouleur] ({-\i}:3.25) node[rotate={270-\i},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$-\i$} ;}
- \draw[\RAPPcouleur] (-30:2.75) node[rotate={270-30},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{6}$} ;
- \draw[\RAPPcouleur] (-45:2.75) node[rotate={270-45},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{4}$} ;
- \draw[\RAPPcouleur] (-60:2.75) node[rotate={270-60},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{3}$} ;
- \draw[\RAPPcouleur] (-90:2.75) node[rotate={270-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{2}$} ;
- \draw[\RAPPcouleur] (-120:2.75) node[rotate={270-120},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-2\pi}{3}$} ;
- \draw[\RAPPcouleur] (-135:2.75) node[rotate={270-135},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-3\pi}{4}$} ;
- \draw[\RAPPcouleur] (-150:2.75) node[rotate={270-150},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-5\pi}{6}$} ;
+ {\draw[\RAPPcouleur] ({-\i}:3.25) node[rotate={270-\i},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$-\i$} ;}
+ \draw[\RAPPcouleur] (-30:2.75) node[rotate={270-30},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{6}$} ;
+ \draw[\RAPPcouleur] (-45:2.75) node[rotate={270-45},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{4}$} ;
+ \draw[\RAPPcouleur] (-60:2.75) node[rotate={270-60},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{3}$} ;
+ \draw[\RAPPcouleur] (-90:2.75) node[rotate={270-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{2}$} ;
+ \draw[\RAPPcouleur] (-120:2.75) node[rotate={270-120},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-2\pi}{3}$} ;
+ \draw[\RAPPcouleur] (-135:2.75) node[rotate={270-135},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-3\pi}{4}$} ;
+ \draw[\RAPPcouleur] (-150:2.75) node[rotate={270-150},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-5\pi}{6}$} ;
}{}
}
{
@@ -440,9 +453,9 @@
\ifboolKV[RapporteurGeom]{AfficheAngles}
{%
\foreach \i in {0,10,...,180}
- {\draw[\RAPPcouleur] (\i:3.2) node[rotate={\i-90},scale=\fpeval{\RAPPechelle*\RAPPechangle},font=\tiny] {\i} ;}
+ {\draw[\RAPPcouleur] (\i:3.2) node[rotate={\i-90},scale=\fpeval{\RAPPechangle},font=\tiny] {\i} ;}
\foreach \i in {0,10,...,180}
- {\draw[\RAPPcouleur] (\i:2.7) node[rotate={\i-90},scale=\fpeval{\RAPPechelle*\RAPPechangle},font=\tiny] {\inteval{180-\i}} ;}
+ {\draw[\RAPPcouleur] (\i:2.7) node[rotate={\i-90},scale=\fpeval{\RAPPechangle},font=\tiny] {\inteval{180-\i}} ;}
}{}
}
\end{scope}
@@ -455,7 +468,8 @@
CouleurFond=\def\POURCcouleurfond{#1},%
Origine=\def\POURCposOrigin{#1},%
Rotation=\def\POURCangle{#1},%
- Opacite=\def\POURCopac{#1}
+ Opacite=\def\POURCopac{#1},%
+ EchelleValeurs=\def\POURCechlabel{#1}
}
\setKVdefault[Pourcenteur]{%
@@ -468,13 +482,14 @@
AfficheValeurs=true,%
Fond=false,%
Opacite=0.5,%
- Decoration=true
+ Decoration=true,%
+ EchelleValeurs=0.8
}
\NewDocumentCommand{\tkzPourcenteur}{ O{} }{%
\useKVdefault[Pourcenteur]%
\setKV[Pourcenteur]{#1}%
- \begin{scope}[shift={(\POURCposOrigin)},rotate=\POURCangle,scale=\POURCechelle,every node/.style={rotate=\POURCangle}]
+ \begin{scope}[shift={(\POURCposOrigin)},rotate=\POURCangle,scale=\POURCechelle,transform shape]
\ifboolKV[Pourcenteur]{Fond}
{%
\fill[draw=none,fill=\POURCcouleurfond!10!white,fill opacity=\POURCopac] (0,0) circle[radius=3] ;
@@ -483,7 +498,7 @@
\draw[\POURCcouleur,semithick] (0,0) circle[radius=3] ;
\draw[\POURCcouleur,semithick] ({-0.15*3},0)--({0.15*3},0) (0,{-0.15*3})--(0,{0.15*3}) ;
\foreach \pct in {0,1,...,199}
- {\draw[\POURCcouleur,thin] ({0.5*\pct*3.6}:{3})--({0.5*\pct*3.6}:{3-0.2}) ;}
+ {\draw[\POURCcouleur,thin] ({0.5*\pct*3.6}:{3})--({0.5*\pct*3.6}:{3-0.2}) ;}
\foreach \pct in {0,10,...,90}{%
\draw[\POURCcouleur,thin] ({(\pct+1)*3.6}:{3})--({(\pct+1)*3.6}:{3-0.35}) ;
\filldraw[\POURCcouleur] ({(\pct+1)*3.6}:{3-0.35}) circle[fill=\POURCcouleur,radius=0.75pt] ;
@@ -505,14 +520,14 @@
\foreach \pct in {5,10,15,20,30,35,40,45,55,60,65,70,80,85,90,95}{%
\draw[\POURCcouleur,semithick] ({\pct*3.6}:{3})--({\pct*3.6}:{3-0.5}) ;
\ifboolKV[Pourcenteur]{AfficheValeurs}
- {\draw ({-\pct*3.6+90}:{3-0.6}) node[\POURCcouleur,rotate={-3.6*\pct},scale=\fpeval{0.8*\POURCechelle*\POURCechangle},font=\tiny] {\pct\,\%} ;}{}
+ {\draw ({-\pct*3.6+90}:{3-0.6}) node[\POURCcouleur,rotate={-3.6*\pct},scale=\fpeval{\POURCechlabel*\POURCechangle},font=\tiny] {\pct\,\%} ;}{}
}
\foreach \pct in {0,25,50,75}{%
\draw[\POURCcouleur,semithick] ({\pct*3.6}:{3})--({\pct*3.6}:{3-0.5}) ;
\ifboolKV[Pourcenteur]{AfficheValeurs}
{%
- \draw ({-\pct*3.6+90}:{3-0.61}) node[\POURCcouleur,rotate={-3.6*\pct},scale=\fpeval{0.8*\POURCechelle*\POURCechangle},font=\scriptsize\bfseries] {\pct\,\%} ;
- \draw ({-\pct*3.6+90}:{2+0.15}) node[\POURCcouleur,rotate={-3.6*\pct},scale=\fpeval{0.8*\POURCechelle*\POURCechangle},font=\tiny\bfseries] {\pct\,\%} ;
+ \draw ({-\pct*3.6+90}:{3-0.61}) node[\POURCcouleur,rotate={-3.6*\pct},scale=\fpeval{\POURCechlabel*\POURCechangle},font=\scriptsize\bfseries] {\pct\,\%} ;
+ \draw ({-\pct*3.6+90}:{2+0.15}) node[\POURCcouleur,rotate={-3.6*\pct},scale=\fpeval{\POURCechlabel*\POURCechangle},font=\tiny\bfseries] {\pct\,\%} ;
}{}%
}
\draw[\POURCcouleur,semithick] (0,1)--(0,2) (1.6,0)--(2,0) (0,-1.6)--(0,-2) (-1.6,0)--(-2,0) ;
@@ -533,7 +548,7 @@
CouleurFond=\def\RAPPEQcouleurfond{#1},%
Origine=\def\RAPPEQposOrigin{#1},%
Rotation=\def\RAPPEQangle{#1},%
- Opacite=\def\RAPPEQopac{#1}
+ Opacite=\def\RAPPEQopac{#1},%
}
\setKVdefault[RapporteurEquerreGeom]{%
@@ -561,7 +576,7 @@
\pgfmathanglebetweenpoints{\pgfpointanchor{\RAPPEQposOrigin}{center}}{\pgfpointanchor{\tmppointdeux}{center}}%
\edef\RAPPEQangle{\pgfmathresult}%
}{}%
- \begin{scope}[shift={(\RAPPEQposOrigin)},rotate=\RAPPEQangle,scale=\RAPPEQechelle,every node/.style={rotate=\RAPPEQangle}]
+ \begin{scope}[shift={(\RAPPEQposOrigin)},rotate=\RAPPEQangle,scale=\RAPPEQechelle,transform shape]
%fond
\ifboolKV[RapporteurEquerreGeom]{Fond}
{%
@@ -591,16 +606,16 @@
\ifboolKV[RapporteurEquerreGeom]{AfficheAngles}
{%
\foreach \i in {10,20,...,170}
- {\draw[\RAPPEQcouleur] ({-\i}:{0.6125*\RAPPEQlargeur}) node[rotate={90-\i},scale=\fpeval{\RAPPEQlargeur/8*\RAPPEQechelle*\RAPPEQechangle},font=\tiny] {\i} ;}
+ {\draw[\RAPPEQcouleur] ({-\i}:{0.6125*\RAPPEQlargeur}) node[rotate={90-\i},scale=\fpeval{\RAPPEQlargeur/8*\RAPPEQechangle},font=\tiny] {\i} ;}
%angles "extérieurs"
\foreach \i in {10,20,...,170}
- {\draw[\RAPPEQcouleur] ({-\i}:{0.6375*\RAPPEQlargeur}) node[rotate={90-\i},scale=\fpeval{\RAPPEQlargeur/8*\RAPPEQechelle*\RAPPEQechangle},font=\tiny] {\inteval{180-\i}} ;}
+ {\draw[\RAPPEQcouleur] ({-\i}:{0.6375*\RAPPEQlargeur}) node[rotate={90-\i},scale=\fpeval{\RAPPEQlargeur/8*\RAPPEQechangle},font=\tiny] {\inteval{180-\i}} ;}
}%
{}%
\ifboolKV[RapporteurEquerreGeom]{AfficheValeurs}
{%
\foreach \i in {-1,0,1}
- {\draw[\RAPPEQcouleur] ({\i},-0.375) node[scale=\fpeval{\RAPPEQechelle*\RAPPEQechangle},font=\tiny] {$\i$} ;}
+ {\draw[\RAPPEQcouleur] ({\i},-0.375) node[scale=\fpeval{\RAPPEQechangle},font=\tiny] {$\i$} ;}
}%
{}%
%tracés intérieurs
diff --git a/graphics/pgf/contrib/pgf-periodictable/README b/graphics/pgf/contrib/pgf-periodictable/README
index b1a6ef2279..f761cd2439 100644
--- a/graphics/pgf/contrib/pgf-periodictable/README
+++ b/graphics/pgf/contrib/pgf-periodictable/README
@@ -1,4 +1,4 @@
-This is pgf-PeriodicTable, version 2.1.1 (2024/07/07).
+This is pgf-PeriodicTable, version 2.1.3 (2024/08/07).
The purpose of this package is to provide the Periodic Table of Elements in
a simple way. It relies on pgf/TikZ to offer a full or partial periodic table with
@@ -22,6 +22,14 @@ ____________________________________________________________
Major changes:
+*** v2.1.3 (07/08/2024) ***
+The engine's detection mechanism (pdfLaTeX, LuaLaTeX or XeTeX) has been changed to prevent erroneous detection when the packages 'hyperref' or 'bookmark' are loaded and the document is compiled with LuaLaTeX - in this case, pgf-PeriodicTable disturbs the selection of the document font.
+Fixed an issue with the Chemical Symbol color when a non-rgb color is used, such as cyan or yellow , which are defined in the xcolor package using the cmyk model (when loaded without options).
+
+*** v2.1.2 (01/08/2024) ***
+Fixed incorrect Spanish translations of some element names.
+Minor code improvements to eliminate runtime warnings («LaTeX Font Warning: Font shape `TU/TeXGyreHeros(0)/l/n' undefined» or «Missing character: There is no m (U+006D) in font nullfont!» ... )
+
*** v2.1.1 (07/07/2024) ***
New keys:
- group numbers (to display group numbers in arabic numerals, Roman numerals or both)
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex
index 78f8178826..0fcc955dd2 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex
@@ -11,7 +11,7 @@ Sets the color of the element name.
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},name color=red]}}%
\\ [0pt]\pgfPTendoption%
% name font
-\pgfPTMoption{4}{name font}{\string\fontseries\{l\}\string\selectfont\string\tiny}{%
+\pgfPTMoption{4}{name font}{\string\tiny}{% \string\fontseries\{l\}\string\selectfont (removed @v2.1.2)
Sets the font of the element name.
}
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},name font=\string\itshape\string\tiny]%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex
index ddaee71477..f53b6659ce 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex
@@ -1,5 +1,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definitions for pgf-PeriodicTable Manual
+% Hugo Gomes @ 07/08/2024 v2.1.3
+% Hugo Gomes @ 01/08/2024 v2.1.2
% Hugo Gomes @ 07/07/2024 v2.1.1
% Hugo Gomes @ 03/04/2024 v2.1.0a
% Hugo Gomes @ 14/02/2024 v2.1.0
@@ -7,7 +9,7 @@
% Hugo Gomes @ 20/02/2023 v2.0.0
% Hugo Gomes @ 08/11/2022 v1.0.1
% Hugo Gomes @ 10/10/2022 v1.0.0
-\def\pgfPTversion{2.1.1}%
+\def\pgfPTversion{2.1.3}%
\def\pgfPTnewinversion#1{new in v#1}%
\def\pgfPTchangedinversion#1{changed in v#1}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -22,31 +24,6 @@
\setcounter{secnumdepth}{1}%
\setcounter{tocdepth}{4}
%
-\makeatletter%
-\global\renewcommand\thesection{}%
-\renewcommand\thesubsection{\@arabic\c@subsection}%
-\renewcommand\section{\@startsection{section}{1}{\z@}%
- {-3.5ex \@plus -1ex \@minus -.2ex}%
- {2.3ex \@plus.2ex}%
- {\hskip-1.4395em\normalfont\Large\bfseries}}%
-\renewcommand*\l@section[2]{%
- \ifnum \c@tocdepth >\z@%
- \addpenalty\@secpenalty%
- \addvspace{1.0em \@plus\p@}%
- \setlength\@tempdima{0em}%
- \begingroup%
- \parindent \z@ \rightskip \@pnumwidth%
- \parfillskip -\@pnumwidth%
- \leavevmode \bfseries%
- \advance\leftskip\@tempdima%
- \hskip -\leftskip%
- #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par%
- \endgroup%
- \fi}%
-\renewcommand*\l@subsection{\@dottedtocline{2}{1.5em}{1.5em}}%
-\renewcommand*\l@subsubsection{\@dottedtocline{3}{3.0em}{2.4em}}%
-\renewcommand*\l@paragraph{\@dottedtocline{4}{4.25em}{1.35em}}%
-\makeatother%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\pgfdeclarelayer{back}%
\pgfsetlayers{back,main}%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty
index d3e8d4cbe1..69f65ee602 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty
+++ b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty
@@ -1,4 +1,6 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Hugo Gomes @ 07/08/2024 v2.1.3
+% Hugo Gomes @ 01/08/2024 v2.1.2
% Hugo Gomes @ 07/07/2024 v2.1.1
% Hugo Gomes @ 03/04/2024 v2.1.0a
% Hugo Gomes @ 14/02/2024 v2.1.0
@@ -8,7 +10,7 @@
% Hugo Gomes @ 10/10/2022 v1.0.0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\NeedsTeXFormat{LaTeX2e}%
-\ProvidesPackage{pgf-PeriodicTable}[07/07/2024 pgf-PeriodicTable v2.1.1]%%
+\ProvidesPackage{pgf-PeriodicTable}[07/08/2024 pgf-PeriodicTable v2.1.3]%%
\RequirePackage{tikz}%
\usetikzlibrary{fadings}%
\tikzfading[name=aumentax, left color=transparent!80, right color=transparent!1]%
@@ -17,11 +19,19 @@
\tikzfading[name=diminuiy, bottom color=transparent!80, top color=transparent!1]%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% check the engine and load font packages
-\ifx\pdfliteral\undefined\relax% XeLaTeX or LuaLaTeX
-\RequirePackage{fontspec}[2020/02/03]\edef\pgfPT@fontspec{1}%
-\else% pdfLaTeX
-\RequirePackage[T1]{fontenc}\edef\pgfPT@fontspec{0}%
-\fi%
+% changed in v2.1.3
+% pdfLaTeX --------------------------------------------------
+\ifx\pdftexversion\undefined\else%
+\RequirePackage[T1]{fontenc}\edef\pgfPT@fontspec{0}\edef\pgfPT@engine{0}%
+\fi% -----------------------------------------------------------
+% LuaLaTeX --------------------------------------------------
+\ifx\directlua\undefined\else%
+\RequirePackage{fontspec}[2020/02/03]\edef\pgfPT@fontspec{1}\edef\pgfPT@engine{1}%
+\fi% -----------------------------------------------------------
+% XeLaTeX ---------------------------------------------------
+\ifx\XeTeXrevision\undefined\else%
+\RequirePackage{fontspec}[2020/02/03]\edef\pgfPT@fontspec{1}\edef\pgfPT@engine{2}%
+\fi% -----------------------------------------------------------
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ifs to user language and list of user translations available
\newif\ifpgfPT@user@lang\pgfPT@user@langfalse%
@@ -3007,7 +3017,9 @@ rectangle
\fi% \pgfPT@element@count=118
\fi\fi% min=1 & max 118
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\@pgfPT@resetlayers% Restoring pgf layers to those used in the document
+% corrected in v2.1.2: \@pgfPT@resetlayers -> \pgfsetlayers{\@pgfPT@resetlayers}
+% ... Warning: Missing character: There is no m (U+006D) in font nullfont! ...
+\pgfsetlayers{\@pgfPT@resetlayers}% Restoring pgf layers to those used in the document
\fontseries{\seriesdefault}\fontshape{\shapedefault}\fontfamily{\familydefault}\selectfont% Restoring the font settings to normal mode in the document
}% end tikz
}%
@@ -3082,15 +3094,14 @@ rectangle
% renders text via pdfliteral: -------------
% #1 outline width width #2 txt #3 #4 #5 rgb stroke color #6 #7 #8 rgb fill color -----------
% #9 txt render mode (0 - fill 1 - stroke 2 - fill then stroke ---------
-\ifx\pdfliteral\undefined\relax%
-\ifx\pdfextension\undefined\relax% XeLaTeX
-\def\pgfPT@lt[#1](#2)(#3,#4,#5)(#6,#7,#8)(#9){\special{pdf:literal direct #1 w #3 #4 #5 RG #6 #7 #8 rg #9 Tr}#2\special{pdf:literal direct 0 0 0 rg 1 w 0 Tr}}%
-\else% LuaLaTeX
-\protected\def\pdfliteral{\pdfextension literal}
+% changed in v2.1.3
+\ifcase\pgfPT@engine\relax% pdfLaTeX
\def\pgfPT@lt[#1](#2)(#3,#4,#5)(#6,#7,#8)(#9){\pdfliteral direct {#1 w #3 #4 #5 RG #6 #7 #8 rg #9 Tr}{#2}\pdfliteral direct {0 0 0 rg 1 w 0 Tr}}%
-\fi%
-\else% pdfLaTeX
+\or% LuaLaTeX
+\protected\def\pdfliteral{\pdfextension literal}%
\def\pgfPT@lt[#1](#2)(#3,#4,#5)(#6,#7,#8)(#9){\pdfliteral direct {#1 w #3 #4 #5 RG #6 #7 #8 rg #9 Tr}{#2}\pdfliteral direct {0 0 0 rg 1 w 0 Tr}}%
+\or% XeLaTeX
+\def\pgfPT@lt[#1](#2)(#3,#4,#5)(#6,#7,#8)(#9){\special{pdf:literal direct #1 w #3 #4 #5 RG #6 #7 #8 rg #9 Tr}#2\special{pdf:literal direct 0 0 0 rg 1 w 0 Tr}}%
\fi%
% END !! \pgfPT@lt --------------------------------------------------------------------------------
%
@@ -3101,9 +3112,10 @@ rectangle
% auxiliary macros to set the rgb components of one color ---------------------------------------
% with use of \extractcolorspecs from xcolor package ---------------------------------------------
% each component is stored in \pgfPT@«r, g or b» & «s or f» -------------------------------------
-\def\pgfPT@extract@rgb@stroke#1{\extractcolorspecs{#1}{\pgfPTcolmodel}{\pgfPTcolinfo}\expandafter\pgfPT@set@rgb@stroke\pgfPTcolinfo\relax}%
+% v3.1.3: added conversion of the color to rgb :: \colorlet{#1}[rgb]{#1}
+\def\pgfPT@extract@rgb@stroke#1{\colorlet{#1}[rgb]{#1}\extractcolorspecs{#1}{\pgfPTcolmodel}{\pgfPTcolinfo}\expandafter\pgfPT@set@rgb@stroke\pgfPTcolinfo\relax}%
\def\pgfPT@set@rgb@stroke#1,#2,#3\relax{\def\pgfPT@rs{#1}\def\pgfPT@gs{#2}\def\pgfPT@bs{#3}}%
-\def\pgfPT@extract@rgb@fill#1{\extractcolorspecs{#1}{\pgfPTcolmodel}{\pgfPTcolinfo}\expandafter\pgfPT@set@rgb@fill\pgfPTcolinfo\relax}%
+\def\pgfPT@extract@rgb@fill#1{\colorlet{#1}[rgb]{#1}\extractcolorspecs{#1}{\pgfPTcolmodel}{\pgfPTcolinfo}\expandafter\pgfPT@set@rgb@fill\pgfPTcolinfo\relax}%
\def\pgfPT@set@rgb@fill#1,#2,#3\relax{\def\pgfPT@rf{#1}\def\pgfPT@gf{#2}\def\pgfPT@bf{#3}}%
% END !! \pgfPT@«color macros» ------------------------------------------------------------------
%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf
index c588490c48..e8c9672259 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf
+++ b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex
index 8406d1a9a7..140577bcce 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex
@@ -376,7 +376,7 @@ name color/.store in=\pgfPTnamecolor,%
name color/.default=black,%
name font/.get=\pgfPTnamefont,%
name font/.store in=\pgfPTnamefont,%
-name font/.default=\fontseries{l}\selectfont\tiny,%
+name font/.default=\tiny,% \fontseries{l}\selectfont (removed @ v2.1.2)
name align/.get=\pgfPTnamealign,% new v1.0.0
name align/.store in=\pgfPTnamealign,% left|center|right
name align/.default=center%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex
index 2c321dcd34..d4135f61b9 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex
@@ -27,7 +27,7 @@
\def\pgfPT@nomes@iii{l\'{i}tio/pt,lithium/en,lithium/fr,Lithium/de,litio/it,litio/es,l\'{i}tio/br,\pgfPT@user@CSname@Li/user}%
\def\pgfPT@nomes@iv{ber\'{i}lio/pt,beryllium/en,b\'{e}ryllium/fr,Beryllium/de,berillio/it,berilio/es,ber\'{i}lio/br,\pgfPT@user@CSname@Be/user}%
\def\pgfPT@nomes@v{boro/pt,boron/en,bore/fr,Bor/de,boro/it,boro/es,boro/br,\pgfPT@user@CSname@B/user}%
-\def\pgfPT@nomes@vi{carbono/pt,carbon/en,carbone/fr,Kohlenstoff/de,carbonio/it,carb\'{o}n/es,carbono/br,\pgfPT@user@CSname@C/user}%
+\def\pgfPT@nomes@vi{carbono/pt,carbon/en,carbone/fr,Kohlenstoff/de,carbonio/it,carbono/es,carbono/br,\pgfPT@user@CSname@C/user}%
\def\pgfPT@nomes@vii{azoto/pt,nitrogen/en,azote/fr,Stickstoff/de,azoto/it,nitr\'{o}geno/es,nitrog\^{e}nio/br,\pgfPT@user@CSname@N/user}%
\def\pgfPT@nomes@viii{oxig\'{e}nio/pt,oxygen/en,oxyg\`{e}ne/fr,Sauerstoff/de,ossigeno/it,ox\'{i}geno/es,oxig\^{e}nio/br,\pgfPT@user@CSname@O/user}%
\def\pgfPT@nomes@ix{fl\'{u}or/pt,fluorine/en,fluor/fr,Fluor/de,fluoro/it,fl\'{u}or/es,fl\'{u}or/br,\pgfPT@user@CSname@F/user}%
@@ -47,7 +47,7 @@
\def\pgfPT@nomes@xxiii{van\'{a}dio/pt,vanadium/en,vanadium/fr,Vanadium/de,vanadio/it,vanadio/es,van\'{a}dio/br,\pgfPT@user@CSname@V/user}%
\def\pgfPT@nomes@xxiv{cr\'{o}mio/pt,chromium/en,chrome/fr,Chrom/de,cromo/it,cromo/es,cr\^{o}mio/br,\pgfPT@user@CSname@Cr/user}%
\def\pgfPT@nomes@xxv{mangan\'{e}sio/pt,manganese/en,mangan\`{e}se/fr,Mangan/de,manganese/it,manganeso/es,mangan\^{e}s/br,\pgfPT@user@CSname@Mn/user}%
-\def\pgfPT@nomes@xxvi{ferro/pt,iron/en,fer/fr,Eisen/de,ferro/it,planchar/es,ferro/br,\pgfPT@user@CSname@Fe/user}%
+\def\pgfPT@nomes@xxvi{ferro/pt,iron/en,fer/fr,Eisen/de,ferro/it,hierro/es,ferro/br,\pgfPT@user@CSname@Fe/user}%
\def\pgfPT@nomes@xxvii{cobalto/pt,cobalt/en,cobalt/fr,Kobalt/de,cobalto/it,cobalto/es,cobalto/br,\pgfPT@user@CSname@Co/user}%
\def\pgfPT@nomes@xxviii{n\'{i}quel/pt,nickel/en,nickel/fr,Nickel/de,nichel/it,n\'{i}quel/es,n\'{i}quel/br,\pgfPT@user@CSname@Ni/user}%
\def\pgfPT@nomes@xxix{cobre/pt,copper/en,cuivre/fr,Kupfer/de,rame/it,cobre/es,cobre/br,\pgfPT@user@CSname@Cu/user}%
@@ -82,7 +82,7 @@
\def\pgfPT@nomes@lviii{c\'{e}rio/pt,cerium/en,c\'{e}rium/fr,Cer/de,cerio/it,cerio/es,c\'{e}rio/br,\pgfPT@user@CSname@Ce/user}%
\def\pgfPT@nomes@lix{praseod\'{i}mio/pt,praseodymium/en,pras\'{e}odyme/fr,Praseodym/de,praseodimio/it,praseodimio/es,praseod\'{i}mio/br,\pgfPT@user@CSname@Pr/user}%
\def\pgfPT@nomes@lx{neod\'{i}mio/pt,neodymium/en,n\'{e}odyme/fr,Neodym/de,neodimio/it,neodimio/es,neod\'{i}mio/br,\pgfPT@user@CSname@Nd/user}%
-\def\pgfPT@nomes@lxi{prom\'{e}cio/pt,promethium/en,prom\'{e}thium/fr,Promethium/de,prometeo/it,prometeo/es,prom\'{e}cio/br,\pgfPT@user@CSname@Pm/user}%
+\def\pgfPT@nomes@lxi{prom\'{e}cio/pt,promethium/en,prom\'{e}thium/fr,Promethium/de,prometeo/it,prometio/es,prom\'{e}cio/br,\pgfPT@user@CSname@Pm/user}%
\def\pgfPT@nomes@lxii{sam\'{a}rio/pt,samarium/en,samarium/fr,Samarium/de,samario/it,samario/es,sam\'{a}rio/br,\pgfPT@user@CSname@Sm/user}%
\def\pgfPT@nomes@lxiii{eur\'{o}pio/pt,europium/en,europium/fr,Europium/de,europium/it,europio/es,eur\'{o}pio/br,\pgfPT@user@CSname@Eu/user}%
\def\pgfPT@nomes@lxiv{gadol\'{i}nio/pt,gadolinium/en,gadolinium/fr,Gadolinium/de,gadolinio/it,gadolinio/es,gadol\'{i}nio/br,\pgfPT@user@CSname@Gd/user}%
@@ -124,20 +124,20 @@
\def\pgfPT@nomes@c{f\'{e}rmio/pt,fermium/en,fermium/fr,Rermium/de,fermium/it,fermio/es,f\'{e}rmio/br,\pgfPT@user@CSname@Fm/user}%
\def\pgfPT@nomes@ci{mendel\'{e}vio/pt,mendelevium/en,mendelevium/fr,Mendelevium/de,mendelevio/it,mendelevio/es,mendel\'{e}vio/br,\pgfPT@user@CSname@Md/user}%
\def\pgfPT@nomes@cii{nob\'{e}lio/pt,nobelium/en,nobelium/fr,Nobelium/de,nobelium/it,nobelio/es,nob\'{e}lio/br,\pgfPT@user@CSname@No/user}%
-\def\pgfPT@nomes@ciii{laur\^{e}ncio/pt,lawrencium/en,lawrencium/fr,Lawrencium/de,laurenzio/it,lawrencium/es,laur\^{e}ncio/br,\pgfPT@user@CSname@Lr/user}%
+\def\pgfPT@nomes@ciii{laur\^{e}ncio/pt,lawrencium/en,lawrencium/fr,Lawrencium/de,laurenzio/it,lawrencio/es,laur\^{e}ncio/br,\pgfPT@user@CSname@Lr/user}%
\def\pgfPT@nomes@civ{rutherf\'{o}rdio/pt,rutherfordium/en,rutherfordium/fr,Rutherfordium/de,rutherfordium/it,rutherfordio/es,rutherf\'{o}rdio/br,\pgfPT@user@CSname@Rf/user}%
-\def\pgfPT@nomes@cv{d\'{u}bnio/pt,dubnium/en,dubnium/fr,Dubnium/de,dubnio/it,dubnium/es,d\'{u}bnio/br,\pgfPT@user@CSname@Db/user}%
+\def\pgfPT@nomes@cv{d\'{u}bnio/pt,dubnium/en,dubnium/fr,Dubnium/de,dubnio/it,dubnio/es,d\'{u}bnio/br,\pgfPT@user@CSname@Db/user}%
\def\pgfPT@nomes@cvi{seab\'{o}rgio/pt,seaborgium/en,seaborgium/fr,Seaborgium/de,seaborgio/it,seaborgio/es,seab\'{o}rgio/br,\pgfPT@user@CSname@Sg/user}%
-\def\pgfPT@nomes@cvii{b\'{o}rio/pt,bohrium/en,bohrium/fr,Bohrium/de,bohrio/it,bohrium/es,b\'{o}hrio/br,\pgfPT@user@CSname@Bh/user}%
-\def\pgfPT@nomes@cviii{h\'{a}ssio/pt,hassium/en,hassium/fr,Hassium/de,hassio/it,hassium/es,h\'{a}ssio/br,\pgfPT@user@CSname@Hs/user}%
+\def\pgfPT@nomes@cvii{b\'{o}rio/pt,bohrium/en,bohrium/fr,Bohrium/de,bohrio/it,bohrio/es,b\'{o}hrio/br,\pgfPT@user@CSname@Bh/user}%
+\def\pgfPT@nomes@cviii{h\'{a}ssio/pt,hassium/en,hassium/fr,Hassium/de,hassio/it,hasio/es,h\'{a}ssio/br,\pgfPT@user@CSname@Hs/user}%
\def\pgfPT@nomes@cix{meitn\'{e}rio/pt,meitnerium/en,meitnerium/fr,Meitnerium/de,meitnerio/it,meitnerio/es,meitn\'{e}rio/br,\pgfPT@user@CSname@Mt/user}%
-\def\pgfPT@nomes@cx{darmst\'{a}dio/pt,darmstadtium/en,darmstadtium/fr,Darmstadtium/de,darmstadtium/it,darmstadtium/es,darmst\'{a}dtio/br,\pgfPT@user@CSname@Ds/user}%
+\def\pgfPT@nomes@cx{darmst\'{a}dio/pt,darmstadtium/en,darmstadtium/fr,Darmstadtium/de,darmstadtium/it,darmstatio/es,darmst\'{a}dtio/br,\pgfPT@user@CSname@Ds/user}%
\def\pgfPT@nomes@cxi{roentg\'{e}nio/pt,roentgenium/en,roentgenium/fr,R\"{o}ntgenium/de,roentgenio/it,roentgenio/es,roentg\^{e}nio/br,\pgfPT@user@CSname@Rg/user}%
\def\pgfPT@nomes@cxii{copern\'{i}cio/pt,copernicium/en,copernicium/fr,Copernicium/de,copernicium/it,copernicio/es,copern\'{i}cio/br,\pgfPT@user@CSname@Cn/user}%
\def\pgfPT@nomes@cxiii{nip\'{o}nio/pt,nihonium/en,nihonium/fr,Nihonium/de,nihonium/it,nihonio/es,nip\^{o}nio/br,\pgfPT@user@CSname@Nh/user}%
\def\pgfPT@nomes@cxiv{fler\'{o}vio/pt,flerovium/en,flerovium/fr,Flerovium/de,flerovio/it,flerovio/es,fler\'{o}vio/br,\pgfPT@user@CSname@Fl/user}%
\def\pgfPT@nomes@cxv{mosc\'{o}vio/pt,moscovium/en,moscovium/fr,Moscovium/de,moscovium/it,moscovio/es,mosc\'{o}vio/br,\pgfPT@user@CSname@Mc/user}%
-\def\pgfPT@nomes@cxvi{liverm\'{o}rio/pt,livermorium/en,livermorium/fr,Livermorium/de,livermorio/it,livermorium/es,liverm\'{o}rio/br,\pgfPT@user@CSname@Lv/user}%
+\def\pgfPT@nomes@cxvi{liverm\'{o}rio/pt,livermorium/en,livermorium/fr,Livermorium/de,livermorio/it,livermorio/es,liverm\'{o}rio/br,\pgfPT@user@CSname@Lv/user}%
\def\pgfPT@nomes@cxvii{tenesso/pt,tennessine/en,tennessine/fr,Tenness/de,tennessine/it,teneso/es,tenesso/br,\pgfPT@user@CSname@Ts/user}%
\def\pgfPT@nomes@cxviii{ogan\'{e}sson/pt,oganesson/en,oganesson/fr,Oganesson/de,oganesson/it,oganes\'{o}n/es,oganess\^{o}nio/br,\pgfPT@user@CSname@Og/user}%
\endinput%
diff --git a/graphics/pgf/contrib/pgfplotsthemebeamer/DEPENDS.txt b/graphics/pgf/contrib/pgfplotsthemebeamer/DEPENDS.txt
index 4708d6bbef..1c4fa2d593 100644
--- a/graphics/pgf/contrib/pgfplotsthemebeamer/DEPENDS.txt
+++ b/graphics/pgf/contrib/pgfplotsthemebeamer/DEPENDS.txt
@@ -1,4 +1,3 @@
hard beamer
hard tools
-hard pgfplots
-hard pgfopts \ No newline at end of file
+hard pgfplots \ No newline at end of file
diff --git a/graphics/pgf/contrib/pgfplotsthemebeamer/README.md b/graphics/pgf/contrib/pgfplotsthemebeamer/README.md
index 9840fce95f..47c815caaf 100644
--- a/graphics/pgf/contrib/pgfplotsthemebeamer/README.md
+++ b/graphics/pgf/contrib/pgfplotsthemebeamer/README.md
@@ -1,8 +1,8 @@
# pgfplotsthemebeamer
-[![GitHub](https://img.shields.io/github/license/samcarter/pgfplotsthemebeamer.svg?color=blue)](http://www.latex-project.org/lppl.txt)
-[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/samcarter/pgfplotsthemebeamer.svg?label=current%20version)](https://github.com/samcarter/pgfplotsthemebeamer/releases/latest)
-[![CTAN](https://img.shields.io/ctan/v/pgfplotsthemebeamer.svg)](https://ctan.org/pkg/pgfplotsthemebeamer)
+[![License](https://img.shields.io/github/license/samcarter/pgfplotsthemebeamer.svg?color=blue)](http://www.latex-project.org/lppl.txt)
+[![GitHub tag](https://img.shields.io/github/tag/samcarter/pgfplotsthemebeamer.svg?label=current%20version&color=blue)](https://github.com/samcarter/pgfplotsthemebeamer/releases/latest)
+[![CTAN](https://img.shields.io/ctan/v/pgfplotsthemebeamer.svg?color=blue)](https://ctan.org/pkg/pgfplotsthemebeamer)
A package for using colours from the current beamer theme in pgfplots diagrams.
diff --git a/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc-settings.sty b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc-settings.sty
index 608482f49e..cd57229fcf 100644
--- a/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc-settings.sty
+++ b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc-settings.sty
@@ -21,7 +21,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{xcolor}
\definecolor{samyellow}{RGB}{246,193,65}
-\definecolor{samorange}{RGB}{241,147,45}
+\definecolor{samorange}{RGB}{241,147,45}% pgfplotsthemebeamer
\definecolor{samred}{RGB}{191,26,46}% TikZbricks
\definecolor{sammagenta}{RGB}{170,42,104}% TikZmarmots
\definecolor{samviolet}{RGB}{136,46,114}% TikZlings
diff --git a/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.pdf b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.pdf
index 460c0a43f2..a312a05245 100644
--- a/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.pdf
+++ b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.tex b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.tex
index 4adfb3679c..3beb6c99b6 100644
--- a/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.tex
+++ b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.tex
@@ -28,10 +28,10 @@
\author{%
\texorpdfstring{
\texttt{samcarter}\\
- \url{https://github.com/samcarter/beamertheme-rainbow}\\
- \url{https://www.ctan.org/pkg/beamertheme-rainbow}
+ \url{https://github.com/samcarter/pgfplotsthemebeamer}\\
+ \url{https://ctan.org/pkg/pgfplotsthemebeamer}
}{samcarter}}
-\date{Version v0.1 \textendash{} 2024/07/26}
+\date{Version v0.2 \textendash{} 2024/08/02}
\usepackage[
themecolor=samorange
@@ -52,7 +52,9 @@
Beamer themes often use carefully composed colour schemes. The \saminline|pgfplotsthemebeamer| package allows to reuse these colours in diagrams created with \saminline|pfgplots|. This ensures a consistent colour scheme throughout the presentation and avoids unsightly colour clashes.
-%The package is included in \TeX{}Live and MiK\TeX\ and available from \textsc{CTAN} (\url{https://www.ctan.org/pkg/pgfplotsthemebeamer}).
+The package is included in \TeX{}Live
+%and MiK\TeX\
+and available from \textsc{CTAN} (\url{https://www.ctan.org/pkg/pgfplotsthemebeamer}).
The development version of this package is located at \url{https://github.com/samcarter/pgfplotsthemebeamer}. If you have any problems, ideas or other feedback, please make constructive use of the issue tracker.
Copyright \raisebox{0.2em}{\tiny\fontfamily{cmr}\selectfont\textcopyright} \texttt{samcarter}. Permission is granted to copy, distribute and\slash or modify this software under the terms of the LaTeX project public licence, version 1.3c or later \url{http://www.latex-project.org/lppl.txt}.
@@ -114,4 +116,4 @@ Users who would like to use the \saminline|beamercolors| scheme for all \saminli
\setlength{\fboxsep}{0pt}%
\fbox{\includegraphics[width=.75\textwidth]{pgfplotsthemebeamer-doc-listing-1.pdf}}%
-\end{document} \ No newline at end of file
+\end{document}
diff --git a/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer.sty b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer.sty
index a47e1f5e97..23006e89c5 100644
--- a/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer.sty
+++ b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer.sty
@@ -12,22 +12,13 @@
% See http://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{pgfplotsthemebeamer}[2024/07/25 version v0.1 PGFplots colours based the colours of the current beamer theme]
+\ProvidesPackage{pgfplotsthemebeamer}[2024/08/02 version v0.2 PGFplots colours based the colours of the current beamer theme]
% error if used with a class other than beamer
\IfClassLoadedF{beamer}{%
\PackageError{pgfplotsthemebeamer}{This pgfplots theme needs to be used in conjunction with the beamer class}{}
}
-% process package options
-\RequirePackage{pgfopts}
-\newif\ifpgfplotsthemebeamer@all
-\pgfkeys{
- pgfplotsthemebeamer/.cd ,
- all/.code = \pgfplotsthemebeamer@alltrue,
-}
-\ProcessPgfOptions{/pgfplotsthemebeamer}
-
% setting up colours
\RequirePackage{pgfplots}
\pgfplotsset{
@@ -40,6 +31,7 @@
}
% making beamercolors default if package is loaded with `all` option
-\ifpgfplotsthemebeamer@all
+\DeclareOption{all}{
\pgfplotsset{beamercolors}
-\fi
+}
+\ProcessOptions\relax
diff --git a/graphics/pgf/contrib/polyomino/README.md b/graphics/pgf/contrib/polyomino/README.md
new file mode 100644
index 0000000000..7f3c8023ad
--- /dev/null
+++ b/graphics/pgf/contrib/polyomino/README.md
@@ -0,0 +1,25 @@
+# `polyomino`
+
+## Polyominoes using Ti*k*Z and LaTeX3
+
+Version 1.0 (2024/08/01)
+
+This package is based on the package [Ti*k*Z](https://ctan.org/pkg/pgf) and can be used to draw polyominoes. It is possible to define custom styles, pics and grids.
+
+%% README.md
+%% Copyright 2024 Matthias Floré
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Matthias Floré.
+%
+% This work consists of the files polyomino.pdf, polyomino.sty,
+% polyomino.tex and README.md. \ No newline at end of file
diff --git a/graphics/pgf/contrib/polyomino/polyomino.pdf b/graphics/pgf/contrib/polyomino/polyomino.pdf
new file mode 100644
index 0000000000..597c00c4db
--- /dev/null
+++ b/graphics/pgf/contrib/polyomino/polyomino.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/polyomino/polyomino.sty b/graphics/pgf/contrib/polyomino/polyomino.sty
new file mode 100644
index 0000000000..7a85590118
--- /dev/null
+++ b/graphics/pgf/contrib/polyomino/polyomino.sty
@@ -0,0 +1,286 @@
+%% polyomino.sty
+%% Copyright 2024 Matthias Floré
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Matthias Floré.
+%
+% This work consists of the files polyomino.pdf, polyomino.sty,
+% polyomino.tex and README.md.
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{tikz}
+\ProvidesExplPackage{polyomino}{2024/08/01}{1.0}{Polyominoes using TikZ and LaTeX3}
+
+%%> \subsection{Variables and variants}
+
+\bool_new:N \l__polyomino_grid_bool
+\bool_new:N \l__polyomino_pic_bool
+
+\int_new:N \l__polyomino_col_int
+\int_new:N \l__polyomino_dir_int
+\int_new:N \l__polyomino_max_int
+\int_new:N \l__polyomino_row_int
+\int_new:N \l__polyomino_x_int
+\int_new:N \l__polyomino_y_int
+
+\seq_new:N \l__polyomino_add_seq
+\seq_new:N \l__polyomino_cols_seq
+
+\tl_new:N \l__polyomino_path_tl
+\tl_new:N \l__polyomino_pic_tl
+
+\cs_generate_variant:Nn \tl_map_inline:nn { en }
+
+%%> \subsection{Pgfkeys}
+
+\pgfkeys
+ {
+ / polyomino /. is~family ,
+ / polyomino /. search~also = / polyomino / p_2 ,
+ / polyomino ,
+ at /. initial = { ( 0 , 0 ) } ,
+ empty~cell /. initial = . ,
+ grid /. code = \bool_set:Nn \l__polyomino_grid_bool { \cs:w c_#1_bool \cs_end: } ,
+ grid /. default = true ,
+ grid = false ,
+ grid~style /. style = { grid_style /. style = {#1} } ,
+ grid_style /. style = {} ,
+ row~sep /. initial = { , } ,
+ }
+
+\pgfkeys
+ {%a separate key family so that the second argument of the key p only accepts keys which apply to a separate polyomino
+ / polyomino / p_2 /. is~family ,
+ / polyomino / p_2 ,
+ connected /. code = \bool_set_false:N \l__polyomino_pic_bool ,
+ connected /. value~forbidden ,
+ discrete /. code = \bool_set_true:N \l__polyomino_pic_bool ,
+ discrete /. value~forbidden ,
+ p /. style~2~args = { #1__style /. style = {#2} } ,%2 underscores to avoid the same name as for example the key style_style
+ pic /. code =
+ {
+ \bool_set_true:N \l__polyomino_pic_bool
+ \tl_set:Nn \l__polyomino_pic_tl {#1}
+ } ,
+ style /. style = { style_style /. style = {#1} } ,
+ style_style /. style = {} ,
+ }
+
+%%> \subsection{The command \textbackslash polyomino}
+
+\NewDocumentCommand \polyomino { O {} m }
+ {
+ {%note the double braces {{...}} so that the contents is in a group and in particular, \pgfkeys is applied locally
+ \pgfkeys { / polyomino , #1 }
+ \int_zero:N \l__polyomino_col_int
+ \int_set:Nn \l__polyomino_row_int { 1 }
+ \seq_clear:N \l__polyomino_cols_seq
+ \tl_map_inline:en {#2}
+ %it is convenient that this ignores spaces in #2
+ %e argument specifier for the case that #2 is given by a command or contains a command
+ {
+ \tl_if_eq:neTF {##1} { \pgfkeysvalueof { / polyomino / row~sep } }
+ {
+ \seq_put_right:NV \l__polyomino_cols_seq \l__polyomino_col_int
+ \int_incr:N \l__polyomino_row_int
+ \int_zero:N \l__polyomino_col_int
+ }
+ {
+ \int_incr:N \l__polyomino_col_int
+ \tl_clear_new:c { l__polyomino_\int_use:N \l__polyomino_row_int _\int_use:N \l__polyomino_col_int _tl }
+ \tl_if_eq:neF {##1} { \pgfkeysvalueof { / polyomino / empty~cell } }
+ { \tl_set:cn { l__polyomino_\int_use:N \l__polyomino_row_int _\int_use:N \l__polyomino_col_int _tl } {##1} }
+ \tl_gclear_new:c { g__polyomino_\int_use:N \l__polyomino_row_int _\int_use:N \l__polyomino_col_int _tl }
+ }
+ }
+ \seq_put_right:NV \l__polyomino_cols_seq \l__polyomino_col_int
+ \int_set:Nn \l__polyomino_max_int { \fp_eval:n { max ( \seq_use:Nn \l__polyomino_cols_seq { , } ) } }
+ \seq_map_indexed_inline:Nn \l__polyomino_cols_seq
+ {
+ \tl_clear_new:c { l__polyomino_##1_0_tl }
+ \int_step_inline:nnn { ##2 + 1 } { \l__polyomino_max_int + 1 }
+ { \tl_clear_new:c { l__polyomino_##1_####1_tl } }
+ }
+ \int_step_inline:nnn { 0 } { \l__polyomino_max_int + 1 }
+ {
+ \tl_clear_new:c { l__polyomino_0_##1_tl }
+ \tl_clear_new:c { l__polyomino_\int_eval:n { \l__polyomino_row_int + 1 }_##1_tl }
+ }
+ \pgfkeys
+ {
+ / tikz ,
+ shift /. expanded = { \pgfkeysvalueof { / polyomino / at } } ,
+ shift = { ( 0 , \seq_count:N \l__polyomino_cols_seq ) }
+ }
+ \seq_map_indexed_inline:Nn \l__polyomino_cols_seq
+ {
+ \int_step_inline:nn {##2}
+ {
+ \tl_if_empty:cF { l__polyomino_##1_####1_tl }
+ {
+ {%note the double braces {{...}} so that \pgfkeys is applied locally
+ \pgfkeys { / polyomino / p_2 , \cs:w l__polyomino_##1_####1_tl \cs_end: __style }
+ \bool_if:NTF \l__polyomino_pic_bool
+ { \pic [ / polyomino / p_2 / style_style ] at ( ####1 - 0.5 , 0.5 - ##1 ) { code = { \l__polyomino_pic_tl } } ; }
+ {
+ \seq_clear:N \l__polyomino_add_seq
+ \tl_if_eq:ccF { l__polyomino_##1_####1_tl } { l__polyomino_##1_\int_eval:n { ####1 - 1 }_tl }
+ {
+ \tl_if_empty:cT { g__polyomino_##1_####1_tl }
+ {
+ \int_set:Nn \l__polyomino_dir_int { 1 }
+ \int_set:Nn \l__polyomino_col_int {####1}
+ \int_set:Nn \l__polyomino_row_int {##1}
+ \int_set:Nn \l__polyomino_x_int {####1}
+ \int_set:Nn \l__polyomino_y_int { 1 - ##1 }
+ \tl_build_begin:N \l__polyomino_path_tl
+ \fp_do_until:nn { ####1 - 1 = \l__polyomino_x_int && 1 - ##1 = \l__polyomino_y_int }
+ {
+ %concerning \tl_build_put_right:Ne \l__polyomino_path_tl,
+ %for example (0,0)--(0,1)--(0,2) results in a larger file size than (0,0)--(0,2)
+ \tl_if_eq:ccTF
+ { l__polyomino_##1_####1_tl }
+ {
+ l__polyomino
+ _\int_eval:n
+ { \l__polyomino_row_int + \clist_item:nn { 0 , 1 , 0 , -1 } { \l__polyomino_dir_int } }
+ _\int_eval:n
+ { \l__polyomino_col_int + \clist_item:nn { 1 , 0 , -1 , 0 } { \l__polyomino_dir_int } }
+ _tl
+ }
+ {
+ \tl_if_eq:ccTF
+ { l__polyomino_##1_####1_tl }
+ {
+ l__polyomino
+ _\int_eval:n
+ { \l__polyomino_row_int + \clist_item:nn { -1 , 1 , 1 , -1 } { \l__polyomino_dir_int } }
+ _\int_eval:n
+ { \l__polyomino_col_int + \clist_item:nn { 1 , 1 , -1 , -1 } { \l__polyomino_dir_int } }
+ _tl
+ }
+ {
+ \tl_build_put_right:Ne \l__polyomino_path_tl
+ { -- ( \int_use:N \l__polyomino_x_int , \int_use:N \l__polyomino_y_int ) }
+ \int_add:Nn \l__polyomino_row_int
+ { \clist_item:nn { -1 , 1 , 1 , -1 } { \l__polyomino_dir_int } }
+ \int_add:Nn \l__polyomino_col_int
+ { \clist_item:nn { 1 , 1 , -1 , -1 } { \l__polyomino_dir_int } }
+ \int_compare:nNnTF { \l__polyomino_dir_int } = { 1 }
+ { \int_set:Nn \l__polyomino_dir_int { 4 } }
+ { \int_decr:N \l__polyomino_dir_int }
+ }
+ {
+ \int_add:Nn \l__polyomino_row_int
+ { \clist_item:nn { 0 , 1 , 0 , -1 } { \l__polyomino_dir_int } }
+ \int_add:Nn \l__polyomino_col_int
+ { \clist_item:nn { 1 , 0 , -1 , 0 } { \l__polyomino_dir_int } }
+ }
+ \tl_if_empty:cTF
+ { g__polyomino_\int_use:N \l__polyomino_row_int _\int_use:N \l__polyomino_col_int _tl }
+ {
+ \seq_put_right:Ne \l__polyomino_add_seq
+ { \int_use:N \l__polyomino_row_int _\int_use:N \l__polyomino_col_int }
+ }
+ {
+ \bool_set_true:N \l__polyomino_pic_bool
+ \int_set:Nn \l__polyomino_x_int { ####1 - 1 }
+ \int_set:Nn \l__polyomino_y_int { 1 - ##1 }
+ }
+ }
+ {
+ \tl_build_put_right:Ne \l__polyomino_path_tl
+ { -- ( \int_use:N \l__polyomino_x_int , \int_use:N \l__polyomino_y_int ) }
+ \int_compare:nNnTF { \l__polyomino_dir_int } = { 4 }
+ { \int_set:Nn \l__polyomino_dir_int { 1 } }
+ { \int_incr:N \l__polyomino_dir_int }
+ }
+ \bool_if:NF \l__polyomino_pic_bool
+ {
+ \int_add:Nn \l__polyomino_x_int { \clist_item:nn { 1 , 0 , -1 , 0 } { \l__polyomino_dir_int } }
+ \int_add:Nn \l__polyomino_y_int { \clist_item:nn { 0 , -1 , 0 , 1 } { \l__polyomino_dir_int } }
+ }
+ }
+ \tl_build_end:N \l__polyomino_path_tl
+ \bool_if:NF \l__polyomino_pic_bool
+ { \fill [ / polyomino / p_2 / style_style ] ( ####1 - 1 , 1 - ##1 ) \l__polyomino_path_tl -- cycle ; }
+ }
+ }
+ \tl_gset:cn { g__polyomino_##1_####1_tl } { c }
+ \seq_map_inline:Nn \l__polyomino_add_seq
+ { \tl_gset:cn { g__polyomino_########1_tl } { c } }
+ }
+ }
+ }
+ }
+ }
+ \bool_if:NT \l__polyomino_grid_bool
+ {
+ \int_step_inline:nn { \seq_count:N \l__polyomino_cols_seq - 1 }
+ {
+ \int_zero:N \l__polyomino_col_int
+ \int_zero:N \l__polyomino_x_int
+ \int_set:Nn \l__polyomino_y_int
+ { \int_min:nn { \seq_item:Nn \l__polyomino_cols_seq {##1} } { \seq_item:Nn \l__polyomino_cols_seq { ##1 + 1 } } }
+ \int_while_do:nNnn { \l__polyomino_x_int } < { \l__polyomino_y_int }
+ {
+ \bool_do_while:nn
+ {
+ \tl_if_eq_p:cc
+ { l__polyomino_##1_\int_use:N \l__polyomino_x_int _tl }
+ { l__polyomino_\int_eval:n { ##1 + 1 }_\int_use:N \l__polyomino_x_int _tl }
+ &&
+ ! \tl_if_empty_p:c { g__polyomino_##1_\int_use:N \l__polyomino_x_int _tl }
+ &&
+ \int_compare_p:nNn { \l__polyomino_x_int } < { \l__polyomino_y_int + 1 }
+ }
+ { \int_incr:N \l__polyomino_x_int }
+ \int_compare:nNnT { \l__polyomino_x_int } > { \l__polyomino_col_int + 1 }
+ {
+ \draw [ / polyomino / grid_style ]
+ ( \int_use:N \l__polyomino_col_int , -##1 ) -- ( \int_use:N \l__polyomino_x_int - 1 , -##1 ) ;
+ }
+ \int_set_eq:NN \l__polyomino_col_int \l__polyomino_x_int
+ }
+ }
+ \int_set:Nn \l__polyomino_x_int { \seq_count:N \l__polyomino_cols_seq }
+ \int_step_inline:nn { \l__polyomino_max_int - 1 }
+ {
+ \int_zero:N \l__polyomino_row_int
+ \int_zero:N \l__polyomino_y_int
+ \int_while_do:nNnn { \l__polyomino_y_int } < { \l__polyomino_x_int }
+ {
+ \bool_do_while:nn
+ {
+ \tl_if_eq_p:cc
+ { l__polyomino_\int_use:N \l__polyomino_y_int _##1_tl }
+ { l__polyomino_\int_use:N \l__polyomino_y_int _\int_eval:n { ##1 + 1 }_tl }
+ &&
+ ! \tl_if_empty_p:c { g__polyomino_\int_use:N \l__polyomino_y_int _##1_tl }
+ &&
+ \int_compare_p:nNn { \l__polyomino_y_int } < { \l__polyomino_x_int + 1 }
+ &&
+ \int_compare_p:nNn {##1} < { \seq_item:Nn \l__polyomino_cols_seq { \l__polyomino_y_int } + 0 }
+ }
+ { \int_incr:N \l__polyomino_y_int }
+ \int_compare:nNnT { \l__polyomino_y_int } > { \l__polyomino_row_int + 1 }
+ {
+ \draw [ / polyomino / grid_style ]
+ ( ##1 , -\int_use:N \l__polyomino_row_int ) -- ( ##1 , 1 - \int_use:N \l__polyomino_y_int ) ;
+ }
+ \int_set_eq:NN \l__polyomino_row_int \l__polyomino_y_int
+ }
+ }
+ }
+ }
+ }
+
+\endinput \ No newline at end of file
diff --git a/graphics/pgf/contrib/polyomino/polyomino.tex b/graphics/pgf/contrib/polyomino/polyomino.tex
new file mode 100644
index 0000000000..c512cec895
--- /dev/null
+++ b/graphics/pgf/contrib/polyomino/polyomino.tex
@@ -0,0 +1,278 @@
+%% polyomino.tex
+%% Copyright 2024 Matthias Floré
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Matthias Floré.
+%
+% This work consists of the files polyomino.pdf, polyomino.sty,
+% polyomino.tex and README.md.
+\documentclass[a4paper,english,dvipsnames]{ltxdoc}
+\usepackage[english]{babel}
+\usepackage{graphicx}
+\usepackage[a4paper,left=2.25cm,right=2.25cm,top=2.5cm,bottom=2.5cm,nohead]{geometry}
+\usepackage{parskip}
+\usepackage{iftex}
+\ifluatex
+\else
+\usepackage[T1]{fontenc}
+\usepackage[utf8]{inputenc}
+\fi
+\usepackage{mathtools}
+\usepackage{amssymb}
+\allowdisplaybreaks
+\usepackage{pdflscape}
+\usepackage{polyomino}
+\input{pgfmanual-en-macros.tex}
+\usepackage{codehigh}
+\usepackage{fancyhdr}
+\pagestyle{fancy}
+\renewcommand{\headrulewidth}{0pt}
+\fancyhead{}
+\ExplSyntaxOn
+\NewExpandableDocumentCommand \repeatnumber {}
+ { \prg_replicate:nn { \thepage } { * } }
+\ExplSyntaxOff
+\fancyfoot[C]{\IfRefUndefinedExpandable{Thesourcecode}{}{\begin{tikzpicture}[scale=0.9]
+\polyomino[
+ grid,
+ p={*}{style={teal,draw=black}}
+]{\repeatnumber}
+\end{tikzpicture}}}
+\usepackage[nottoc]{tocbibind}
+\usepackage{imakeidx}
+\makeindex[program=makeindex,columns=2,intoc=true]
+\indexsetup{othercode={\thispagestyle{fancy}}}
+\AtEndPreamble{\hypersetup{%
+linktoc=all,
+pdfstartview=FitH,
+colorlinks=true,
+linkcolor=Mahogany,
+citecolor=ForestGreen,
+urlcolor=MidnightBlue,
+bookmarksnumbered=true,
+pdftitle={The polyomino package},
+pdfauthor={Matthias Floré},
+pdfsubject={Manual},
+pdfkeywords={polyomino}}}
+\setcounter{tocdepth}{2}
+\setcounter{secnumdepth}{2}
+\title{The \texttt{polyomino} package\\[12pt]\large Polyominoes using \tikzname{} and \LaTeX3}
+\author{Matthias Floré}
+\date{Version 1.0 (2024/08/01)}%\\[12pt]
+\begin{document}
+\maketitle
+\thispagestyle{fancy}
+\begin{abstract}
+\noindent This package is based on the package |tikz| (see \cite{TtTaPGFp}) and can be used to draw polyominoes. It is possible to define custom styles, pics and grids.% This is the manual for version .
+\end{abstract}
+\tableofcontents
+\section{Usage}
+The package |polyomino| can be used by putting the following in the preamble.
+\begin{codeexample}[code only]
+\usepackage{polyomino}
+\end{codeexample}
+The package |polyomino| loads the package |tikz|.
+\section{The command \textbackslash polyomino}
+\begin{command}{\polyomino\opt{\oarg{options}}\marg{polyomino specification}}
+This command can be placed inside a |tikzpicture| environment. The \meta{polyomino specification} is a token list. Spaces in this list are ignored. With the initial settings, a |,| starts a new row. Otherwise each element in this list corresponds to a cell. An element can consist of multiple characters by surrounding it with braces. The \meta{options} can be given with the keys described in Section \ref{Keys}.
+\begin{codeexample}[width=8cm]
+\pgfkeys{
+ /polyomino,
+ p={F}{style={blue,draw=black,ultra thick}},
+ p={I}{style={brown,draw=black,ultra thick}},
+ p={L}{style={cyan,draw=black,ultra thick}},
+ p={N}{style={gray,draw=black,ultra thick}},
+ p={P}{style={lime,draw=black,ultra thick}},
+ p={T}{style={magenta,draw=black,ultra thick}},
+ p={U}{style={olive,draw=black,ultra thick}},
+ p={V}{style={orange,draw=black,ultra thick}},
+ p={W}{style={pink,draw=black,ultra thick}},
+ p={X}{style={purple,draw=black,ultra thick}},
+ p={Y}{style={red,draw=black,ultra thick}},
+ p={Z}{style={teal,draw=black,ultra thick}}
+}
+\begin{tikzpicture}
+\polyomino[
+ grid
+]{
+ UUUVVV,
+ UXUZZV,
+ XXXFZV,
+ IXFFZZ,
+ ILLFFT,
+ ILNTTT,
+ ILNWWT,
+ ILNNWW,
+ PPPNYW,
+ PPYYYY
+}
+\end{tikzpicture}
+\end{codeexample}
+The algorithm constructs the border of each polyomino. It does not consider holes determined by empty cells. Although it does detect a cell inside a polyomino which has a different style. This is illustrated in the example below.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}[scale=0.8]
+\polyomino[
+ p={a}{style={gray,draw=black,thick}}
+]{
+ aaaaa,
+ a.a.a,
+ aaaaa
+}
+\polyomino[
+ at={(0,-4)},
+ p={a}{style={gray,draw=black,thick}},
+ p={*}{style={white,draw=black,thick}}
+]{
+ aaaaa,
+ a*a*a,
+ aaaaa
+}
+\end{tikzpicture}
+\end{codeexample}
+\end{command}
+\section{Keys}\label{Keys}
+The keys in this Section can be given as \meta{options} to the command |\polyomino|.
+
+There are two key families: |/polyomino| and |/polyomino/p_2|. The key family |/polyomino| is intended for usage in documents whereas |/polyomino/p_2| is not. In the key family |/polyomino|, also keys from the key family |/polyomino/p_2| will be looked up. The second argument from the key |p| only accepts keys from the key family |/polyomino/p_2|.
+\begin{key}{/polyomino/at=\marg{point} (initially (0,0))}
+This key defines the bottom left coordinate of the polyomino.
+\end{key}
+\begin{key}{/polyomino/p\_2/connected}
+This key sets the |pic| type (which is activated by the key |pic|) to false. This is the initial setting.
+\end{key}
+\begin{key}{/polyomino/p\_2/discrete}
+This key sets the |pic| type (which is activated by the key |pic|) to true.
+\end{key}
+\begin{key}{/polyomino/empty cell=\marg{token list} (initially .)}
+A cell corresponding to the \meta{token list} in the \meta{polyomino specification} will be left empty.
+
+A cell corresponding to the empty token list will always be left empty.
+\end{key}
+\begin{key}{/polyomino/grid=\opt{\meta{boolean}} (default true, initially false)}
+If true then a grid is drawn. The grid does not apply to borders of polyominoes. The style of this grid is determined by the key |grid style|. A grid does not apply to a cell with a |pic|.
+\end{key}
+\begin{stylekey}{/polyomino/grid style=\marg{options} (initially \normalfont empty)}
+This key determines the style of the grid.
+\begin{codeexample}[width=6.5cm]
+\begin{tikzpicture}[rotate=90]
+\polyomino[
+ grid,
+ grid style={gray,dash pattern=on 3mm off 4mm on 3mm off 0mm},
+ p={L}{style={darkgray,draw=black}},
+ p={P}{style={green,draw=black}},
+ p={T}{style={violet,draw=black}},
+ p={V}{style={yellow,draw=black}}
+]{
+ LTVVV,
+ LTTTV,
+ LTPPV,
+ LLPPP
+}
+\end{tikzpicture}
+\end{codeexample}
+\end{stylekey}
+\begin{stylekey}{/polyomino/p\_2/p=\marg{name}\marg{options} (initially \normalfont empty)}
+This key determines the style of the polyomino with \meta{name} in the \meta{polyomino specification}.
+
+The \meta{options} only accept keys from the key family |/polyomino/p_2|.
+
+In the example below, the polyominoes have the same shape but are differentiated by using different names.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\pgfkeys{
+ /polyomino,
+ p={a}{},
+ p={b}{},
+ style={fill=none,draw}
+}
+\def\example{
+ aa,
+ ab,
+ ab,
+ bb
+}
+\polyomino{\example}
+\polyomino[
+ at={(2,0)}
+]{\example}
+\end{tikzpicture}
+\end{codeexample}
+\end{stylekey}
+\begin{key}{/polyomino/p\_2/pic=\marg{code}}
+The \meta{code} defines the |pic| which is used for each cell of the polyomino.
+
+A grid does not apply to a cell with a |pic|.
+\begin{codeexample}[width=7cm]
+\begin{tikzpicture}
+\polyomino[
+ empty cell=*,
+ grid,
+ p={a}{style={red,draw=black}},
+ p={b}{style={blue,draw=black}},
+ p={c}{style={orange,draw=black}},
+ p={circle}{pic={\fill[green] (0,0) circle[radius=0.4];}},
+ row sep=;
+]{
+ {} * * b {} c ;
+ a a b b {circle} c ;
+ {circle} a a b c c
+}
+\end{tikzpicture}
+\end{codeexample}
+\begin{codeexample}[width=5cm]
+\begin{tikzpicture}
+\polyomino[
+ p={circle}{
+ pic={\path[pic actions] (0,0) circle[radius=0.45];},
+ style={right color=cyan,left color=red,draw,dashed}
+ },
+ p={L}{
+ pic={
+ \fill[yellow!80!black] (-0.5,-0.5) rectangle +(1,1);
+ \fill[yellow!50,rounded corners] (-0.4,-0.4) rectangle +(0.8,0.8);
+ }
+ },
+ p={square}{
+ pic={\path[pic actions] (-0.45,-0.45) rectangle +(0.9,0.9);},
+ style={fill=magenta,draw,rounded corners}
+ }
+]{
+ L {circle} {square} {square} ,
+ L {circle} {circle} {square} ,
+ L L {circle} {circle}
+}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/polyomino/row sep=\marg{token list} (initially ,)}
+The \meta{token list} in the \meta{polyomino specification} will start a new row.
+\end{key}
+\begin{stylekey}{/polyomino/p\_2/style=\marg{options} (initially \normalfont empty)}
+This key determines the style of the polyomino.
+\end{stylekey}
+\begin{thebibliography}{9}
+\bibitem{TtTaPGFp}
+Till Tantau,
+\emph{The \tikzname{} and {\upshape\pgfname} Packages},
+Manual for version 3.1.10,
+\url{https://ctan.org/pkg/pgf},
+2023.
+\end{thebibliography}
+\printindex
+\newgeometry{left=2.25cm,right=2.25cm,top=2.25cm,bottom=2.25cm}
+\pagestyle{plain}
+\appendix
+\begin{landscape}
+\section{The source code}\label{Thesourcecode}
+\dochighinput[language=latex/latex3]{polyomino.sty}
+\end{landscape}
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/wordle/README.md b/graphics/pgf/contrib/wordle/README.md
index f1977a1ae7..fdfd996870 100644
--- a/graphics/pgf/contrib/wordle/README.md
+++ b/graphics/pgf/contrib/wordle/README.md
@@ -1,8 +1,33 @@
-wordle is a package to work with Wordle game.
------------------------------------------------------------
-wordle est un package pour travailler avec le jeu du sutom.
------------------------------------------------------------
-Author : Cédric Pierquet
-email : cpierquet@outlook.fr
-Licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
-Source : https://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex \ No newline at end of file
+![v![]()ersion](https://img.shields.io/github/v/tag/AndrewMathas/wordle?color=success&label=version)
+<a href="http://www.latex-project.org/lppl.txt"><img src="https://img.shields.io/badge/license-LPPLv1.3c-blueviolet.svg"></a>
+<a href="https://www.latex-project.org/"><img src="https://img.shields.io/badge/latex-20B2AA?logo=Latex"></a>
+
+# Wordle
+
+A stupidly feature-rich LaTeX package for typesetting **Wordle** puzzles. This package provides a stupidly feature-rich way of creating Wordle puzzles in LaTeX, which [Wikipedia](https://en.wikipedia.org/wiki/Wordle) describes as a hugely popular web-based word game created and developed by Welsh software engineer Josh Wardle.
+
+This package provides the `wordle` environment, which uses the syntax:
+
+```tex
+% \usepackage{wordle}
+\begin{wordle}{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+\end{wordle}
+```
+
+Ce package fournit un moyen stupidement riche en fonctionnalités de créer des puzzles **Wordle** en LaTeX, que [Wikipedia](https://en.wikipedia.org/wiki/Wordle) décrit comme comme un jeu de lettres en ligne extrêmement populaire, créé et développé par l'ingénieur logiciel gallois Josh Wardle.
+
+```tex
+% \usepackage{wordle}
+\begin{GrilleSutom}{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+\end{GrilleSutom}
+```
+
+### Authors
+Andrew Mathas and Cédric Pierquet
+
diff --git a/graphics/pgf/contrib/wordle/doc/wordle-doc-en.pdf b/graphics/pgf/contrib/wordle/doc/wordle-doc-en.pdf
deleted file mode 100644
index aadb07f54b..0000000000
--- a/graphics/pgf/contrib/wordle/doc/wordle-doc-en.pdf
+++ /dev/null
Binary files differ
diff --git a/graphics/pgf/contrib/wordle/doc/wordle-doc-en.tex b/graphics/pgf/contrib/wordle/doc/wordle-doc-en.tex
deleted file mode 100644
index 06352f5ad5..0000000000
--- a/graphics/pgf/contrib/wordle/doc/wordle-doc-en.tex
+++ /dev/null
@@ -1,426 +0,0 @@
-% !TeX TXS-program:compile = txs:///arara
-% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode}
-% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
-
-\documentclass[english,a4paper,11pt]{article}
-\usepackage[margin=2cm,includefoot]{geometry}
-\def\TPversion{0.1.1}
-\def\TPdate{03/09/2023}
-\usepackage{amssymb,amsfonts,amsmath}
-\usepackage[utf8]{inputenc}
-%\usepackage[T1]{fontenc}
-\usepackage{wordle}
-\usepackage{awesomebox}
-\usepackage{fontawesome5}
-\usepackage{footnote}
-\makesavenoteenv{tabular}
-\usepackage{enumitem}
-\usepackage{tabularray}
-\usepackage{fancyvrb}
-\usepackage{fancyhdr}
-\fancyhf{}
-\renewcommand{\headrulewidth}{0pt}
-\lfoot{\sffamily\small [wordle]}
-\cfoot{\sffamily\small - \thepage{} -}
-\rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}}
-
-%\usepackage{hvlogos}
-\usepackage{xspace}
-\usepackage{hologo}
-\providecommand\tikzlogo{Ti\textit{k}Z}
-\providecommand\TeXLive{\TeX{}Live\xspace}
-\providecommand\PSTricks{\textsf{PSTricks}\xspace}
-\let\pstricks\PSTricks
-\let\TikZ\tikzlogo
-\newcommand\TableauDocumentation{%
- \begin{tblr}{width=\linewidth,colspec={X[c]X[c]X[c]X[c]X[c]X[c]},cells={font=\sffamily}}
- {\LARGE \LaTeX} & & & & &\\
- & {\LARGE \hologo{pdfLaTeX}} & & & & \\
- & & {\LARGE \hologo{LuaLaTeX}} & & & \\
- & & & {\LARGE \TikZ} & & \\
- & & & & {\LARGE \TeXLive} & \\
- & & & & & {\LARGE \hologo{MiKTeX}} \\
- \end{tblr}
-}
-
-\usepackage{hyperref}
-\urlstyle{same}
-\hypersetup{pdfborder=0 0 0}
-\setlength{\parindent}{0pt}
-\definecolor{LightGray}{gray}{0.9}
-
-\usepackage{babel}
-%\AddThinSpaceBeforeFootnotes
-%\FrenchFootnotes
-
-\usepackage{listings}
-
-\usepackage{newverbs}
-\newverbcommand{\motcletex}{\color{cyan!75!black}}{}
-\newverbcommand{\packagetex}{\color{violet!75!black}}{}
-
-\usepackage[most]{tcolorbox}
-\tcbuselibrary{listingsutf8}
-\newtcblisting{DemoCode}[1][]{%
- enhanced,width=0.95\linewidth,center,%
- bicolor,size=title,%
- colback=cyan!2!white,%
- colbacklower=cyan!1!white,%
- colframe=cyan!75!black,%
- listing options={%
- breaklines=true,%
- breakatwhitespace=true,%
- style=tcblatex,basicstyle=\small\ttfamily,%
- tabsize=4,%
- commentstyle={\itshape\color{gray}},
- keywordstyle={\color{blue}},%
- classoffset=0,%
- keywords={},%
- alsoletter={-},%
- keywordstyle={\color{blue}},%
- classoffset=1,%
- alsoletter={-},%
- morekeywords={center,justify},%
- keywordstyle={\color{violet}},%
- classoffset=2,%
- alsoletter={-},%
- morekeywords={WordleGrid},%
- keywordstyle={\color{green!50!black}},%
- classoffset=3,%
- morekeywords={Colors,Rounded,Unit,Font,ColorLetters,Letters,Style,Thickness,BorderColor},%
- keywordstyle={\color{orange}}
- },%
- #1
-}
-
-\tcbset{vignettes/.style={%
- nobeforeafter,box align=base,boxsep=0pt,enhanced,sharp corners=all,rounded corners=southeast,%
- boxrule=0.75pt,left=7pt,right=1pt,top=0pt,bottom=0.25pt,%
- }
-}
-
-\tcbset{vignetteMaJ/.style={%
- fontupper={\vphantom{pf}\footnotesize\ttfamily},
- vignettes,colframe=purple!50!black,coltitle=white,colback=purple!10,%
- overlay={\begin{tcbclipinterior}%
- \fill[fill=purple!75]($(interior.south west)$) rectangle node[rotate=90]{\tiny \sffamily{\textcolor{black}{\scalebox{0.66}[0.66]{\textbf{MàJ}}}}} ($(interior.north west)+(5pt,0pt)$);%
- \end{tcbclipinterior}}
- }
-}
-
-\newcommand\Cle[1]{{\small\sffamily\textlangle \textcolor{orange}{#1}\textrangle}}
-\newcommand\cmaj[1]{\tcbox[vignetteMaJ]{#1}\xspace}
-
-\begin{document}
-
-\setlength{\aweboxleftmargin}{0.07\linewidth}
-\setlength{\aweboxcontentwidth}{0.93\linewidth}
-\setlength{\aweboxvskip}{8pt}
-
-\pagestyle{fancy}
-
-\thispagestyle{empty}
-
-\vspace{2cm}
-
-\begin{center}
- \begin{minipage}{0.75\linewidth}
- \begin{tcolorbox}[colframe=yellow,colback=yellow!15]
- \begin{center}
- \begin{tabular}{c}
- {\Huge \texttt{wordle} [en]}\\
- \\
- {\LARGE Grids of Wordle,} \\
- \\
- {\LARGE made with \textsf{Ti\textit{k}Z}.} \\
- \end{tabular}
-
- \bigskip
-
- {\small \texttt{Version \TPversion{} -- \TPdate}}
- \end{center}
- \end{tcolorbox}
-\end{minipage}
-\end{center}
-
-\begin{center}
- \begin{tabular}{c}
- \texttt{Cédric Pierquet}\\
- {\ttfamily c pierquet -- at -- outlook . fr}\\
- \texttt{\url{https://github.com/cpierquet/wordle}}
-\end{tabular}
-\end{center}
-
-\vspace{0.25cm}
-
-{$\blacktriangleright$~~Create Wordle grids Wordle/Sutom\footnotemark\footnotetext{\url{https://en.wikipedia.org/wiki/Wordle}}.}
-
-\vspace{0.25cm}
-
-{$\blacktriangleright$~~Specify colors and font\footnotemark\footnotetext{Ideas from \url{ttps://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex}}.
-
-\vspace{0.5cm}
-
-\begin{center}
-\begin{WordleGrid}{CRAZE}
- GRAIL TRACK CRAMP CRABS CRAZY CRAZE
-\end{WordleGrid}
-\end{center}
-
-\begin{center}
-\begin{WordleGrid}[Rounded=0,Colors={lightgray,orange,teal},Style=alt,Unit=0.5,Letters=false]{LADLE}
- FLAIL LAPEL LADLE
-\end{WordleGrid}
-%
-\hspace{5mm}
-%
-\begin{WordleGrid}[Rounded=0,Colors={lightgray,orange,teal},Style=alt,Unit=0.5]{LADLE}
- FLAIL LAPEL LADLE
-\end{WordleGrid}
-\end{center}
-
-\vspace{0.25cm}
-
-%\hfill{}\textit{Merci à Denis Bitouzé et à Gilles Le Bourhis pour leurs retours et idées !}
-
-\smallskip
-
-\vfill
-
-\hrule
-
-\medskip
-
-\TableauDocumentation
-
-\medskip
-
-\hrule
-
-\vspace*{1cm}
-
-\newpage
-
-\phantomsection
-\hypertarget{matoc}{}
-
-\tableofcontents
-
-\vfill
-
-\section{History}
-
-\verb|v0.1.1|~:~~~~Bugfix with english version.
-
-\verb|v0.1.0|~:~~~~Initial version.
-
-\newpage
-
-\section{The wordle package}
-
-\subsection{The game}
-
-\begin{noteblock}
-Wordle is a web-based word game created and developed by Welsh software engineer Josh Wardle. Players have six attempts to guess a five-letter word, with feedback given for each guess in the form of colored tiles indicating when letters match or occupy the correct position.
-
-Every day, a five-letter word is chosen which players aim to guess within six tries. After every guess, each letter is marked as either green, yellow or gray: green indicates that letter is correct and in the correct position, yellow means it is in the answer but not in the right position, while gray indicates it is not in the answer at all. Multiple instances of the same letter in a guess, such as the "o"s in "robot", will be colored green or yellow only if the letter also appears multiple times in the answer; otherwise, excess repeating letters will be colored gray.
-
-\smallskip
-
-\hfill{\scriptsize \url{https://en.wikipedia.org/wiki/Wordle}}
-\end{noteblock}
-
-\subsection{The package}
-
-\begin{noteblock}
-This package can display, in a \textsf{tex} file, a wordle grid (with \TikZ{} and within a \motcletex!minipage!), with ability :
-
-\begin{itemize}
- \item to change dimensions and colors ;
- \item to pick style for misplaced letters ;
- \item to change borders and corners ;
- \item to print or not the letters.
-\end{itemize}
-
-It's possible to "play" with other words than five-letter words !
-\end{noteblock}
-
-\begin{importantblock}
-Most of source code, in \hologo{LaTeX3}, is given by thread from \texttt{tex.stackexchange}, proposed by user \textsf{3141592653589793238}.
-\end{importantblock}
-
-\subsection{Loading of the package, used packages}
-
-\begin{importantblock}
-The package \packagetex!wordle! loads within the preamble.
-
-There's no option, and \packagetex!xcolor! isn't loaded.
-\end{importantblock}
-
-\begin{DemoCode}[listing only]
-\documentclass{article}
-\usepackage{wordle}
-
-\end{DemoCode}
-
-\begin{noteblock}
-\packagetex!wordle! loads the following packages and libraries :
-
-\begin{itemize}
- \item \packagetex!tikz!;
- \item \packagetex!simplekv! ;
- \item \packagetex!xstring!.
-\end{itemize}
-
-It’s mostly compatible with \textsf{latex}, \textsf{pdflatex}, \textsf{lualatex} or \textsf{xelatex} compilation !
-\end{noteblock}
-
-\vfill~
-
-\pagebreak
-
-\section{WordleGrid environment}
-
-\subsection{Environment}
-
-\begin{cautionblock}
-The environment to display a Wordle grid is \packagetex!WordleGrid!.
-
-It works with keys, between \texttt{[...]} and needs to know :
-
-\begin{itemize}
- \item the good word ;
- \item the different guesses.
-\end{itemize}
-
-The code create the grid and the colors !
-\end{cautionblock}
-
-\begin{DemoCode}[listing only]
-\begin{WordleGrid}[keys]{good word}
- guess n°1
- guess n°2
- guess n°3
-\end{WordleGrid}
-\end{DemoCode}
-
-\begin{noteblock}
-the grid is created with a \motcletex!minipage!, with automatic width and spacings !
-\end{noteblock}
-
-\begin{DemoCode}[]
-%default output
-\begin{WordleGrid}{REBUS}
- ARISE
- ROUTE
- RULES
- REBUS
-\end{WordleGrid}
-\end{DemoCode}
-
-\subsection{Keys and options}
-
-\begin{tipblock}
-The first argument, mandatory and between \texttt{[...]}, proposes the following \Cle{keys} :
-
-\begin{itemize}
- \item \Cle{Colors} : = colors of the boxes \Cle{back,misplaced,good} ;
-
- \hfill{}default : \Cle{WordleBack,WordleBad,WordleGood},%
- \item \Cle{Rounded} := arc for corners, in mm ; \hfill{}default : \Cle{0.1}
- \item \Cle{Unit} := width of cases, in cm ; \hfill{}default : \Cle{1}
- \item \Cle{Font} := font for letters ; \hfill{}default : \Cle{\textbackslash LARGE\textbackslash bfseries\textbackslash sffamily}
- \item \Cle{ColorLetters} := color for letters ; \hfill{}default : \Cle{white}
- \item \Cle{BorderColor} := color fot the border ; \hfill{}default : \Cle{white}
- \item \Cle{Letters} := boolean to print letters ; \hfill{}default : \Cle{true}
- \item \Cle{Style} := style within \Cle{default / other} to change the style ; \hfill{}default : \Cle{default}
- \item \Cle{Thick} := thickness of the borders, in mm. \hfill{}default : \Cle{0.25}
-\end{itemize}
-\vspace*{-\baselineskip}\leavevmode
-\end{tipblock}
-
-\begin{tipblock}
-The second argument, optional and between \texttt{\{...\}} is the correct word.
-
-\smallskip
-
-Different guesses are given within the body of the environment (line by line or space separated).
-\end{tipblock}
-
-\subsection{Examples}
-
-\begin{DemoCode}[]
-\begin{WordleGrid}{BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-%
-\hspace{5mm}
-%
-\begin{WordleGrid}[Style=alt]{BURGH}
- ABATE HERBS BURLY BURGH
-\end{WordleGrid}
-\end{DemoCode}
-
-\begin{DemoCode}[]
-\begin{WordleGrid}
- [Thickness=0.3,BorderColor=black,%
- Colors={lightgray,orange,teal}]{BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-%
-\hspace{5mm}
-%
-\begin{WordleGrid}
- [Rounded=0,Thickness=0.3,BorderColor=black,%
- Colors={lightgray,orange,teal}]{BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-\end{DemoCode}
-
-\begin{DemoCode}[]
-\begin{WordleGrid}[Unit=2,Font=\Huge\ttfamily,ColorLetters=black]{BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-\end{DemoCode}
-
-\begin{DemoCode}[]
-\begin{WordleGrid}%
- [Unit=0.75,Rounded=0,Colors={cyan,orange,violet},Letters=false]{BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-\hspace{5mm}
-\begin{WordleGrid}%
- [Unit=0.75,Rounded=0,Colors={cyan,orange,violet},Style=alt]
- {BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-\hspace{5mm}
-\begin{WordleGrid}%
- [Unit=0.75,Rounded=0,Colors={cyan,orange,violet},Style=alt,Letters=false]
- {BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-\end{DemoCode}
-
-\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/wordle/doc/wordle-doc-fr.pdf b/graphics/pgf/contrib/wordle/doc/wordle-doc-fr.pdf
deleted file mode 100644
index 3277ca9a99..0000000000
--- a/graphics/pgf/contrib/wordle/doc/wordle-doc-fr.pdf
+++ /dev/null
Binary files differ
diff --git a/graphics/pgf/contrib/wordle/doc/wordle-doc-fr.tex b/graphics/pgf/contrib/wordle/doc/wordle-doc-fr.tex
deleted file mode 100644
index f365cbb459..0000000000
--- a/graphics/pgf/contrib/wordle/doc/wordle-doc-fr.tex
+++ /dev/null
@@ -1,422 +0,0 @@
-% !TeX TXS-program:compile = txs:///arara
-% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode}
-% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
-
-\documentclass[french,a4paper,11pt]{article}
-\usepackage[margin=2cm,includefoot]{geometry}
-\def\TPversion{0.1.1}
-\def\TPdate{3 septembre 2023}
-\usepackage{amssymb,amsfonts,amsmath}
-\usepackage[utf8]{inputenc}
-%\usepackage[T1]{fontenc}
-\usepackage{wordle}
-\usepackage{awesomebox}
-\usepackage{fontawesome5}
-\usepackage{footnote}
-\makesavenoteenv{tabular}
-\usepackage{enumitem}
-\usepackage{tabularray}
-\usepackage{fancyvrb}
-\usepackage{fancyhdr}
-\fancyhf{}
-\renewcommand{\headrulewidth}{0pt}
-\lfoot{\sffamily\small [wordle]}
-\cfoot{\sffamily\small - \thepage{} -}
-\rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}}
-
-%\usepackage{hvlogos}
-\usepackage{hologo}
-\providecommand\tikzlogo{Ti\textit{k}Z}
-\providecommand\TeXLive{\TeX{}Live\xspace}
-\providecommand\PSTricks{\textsf{PSTricks}\xspace}
-\let\pstricks\PSTricks
-\let\TikZ\tikzlogo
-\newcommand\TableauDocumentation{%
- \begin{tblr}{width=\linewidth,colspec={X[c]X[c]X[c]X[c]X[c]X[c]},cells={font=\sffamily}}
- {\LARGE \LaTeX} & & & & &\\
- & {\LARGE \hologo{pdfLaTeX}} & & & & \\
- & & {\LARGE \hologo{LuaLaTeX}} & & & \\
- & & & {\LARGE \TikZ} & & \\
- & & & & {\LARGE \TeXLive} & \\
- & & & & & {\LARGE \hologo{MiKTeX}} \\
- \end{tblr}
-}
-
-\usepackage{hyperref}
-\urlstyle{same}
-\hypersetup{pdfborder=0 0 0}
-\setlength{\parindent}{0pt}
-\definecolor{LightGray}{gray}{0.9}
-
-\usepackage{babel}
-\AddThinSpaceBeforeFootnotes
-\FrenchFootnotes
-
-\usepackage{listings}
-
-\usepackage{newverbs}
-\newverbcommand{\motcletex}{\color{cyan!75!black}}{}
-\newverbcommand{\packagetex}{\color{violet!75!black}}{}
-
-\usepackage[most]{tcolorbox}
-\tcbuselibrary{listingsutf8}
-\newtcblisting{DemoCode}[1][]{%
- enhanced,width=0.95\linewidth,center,%
- bicolor,size=title,%
- colback=cyan!2!white,%
- colbacklower=cyan!1!white,%
- colframe=cyan!75!black,%
- listing options={%
- breaklines=true,%
- breakatwhitespace=true,%
- style=tcblatex,basicstyle=\small\ttfamily,%
- tabsize=4,%
- commentstyle={\itshape\color{gray}},
- keywordstyle={\color{blue}},%
- classoffset=0,%
- keywords={},%
- alsoletter={-},%
- keywordstyle={\color{blue}},%
- classoffset=1,%
- alsoletter={-},%
- morekeywords={center,justify},%
- keywordstyle={\color{violet}},%
- classoffset=2,%
- alsoletter={-},%
- morekeywords={GrilleSutom},%
- keywordstyle={\color{green!50!black}},%
- classoffset=3,%
- morekeywords={Couleurs,Arrondi,Unite,Police,CouleurLettres,Lettres,Style,Epaisseur,CouleurBordure},%
- keywordstyle={\color{orange}}
- },%
- #1
-}
-
-\tcbset{vignettes/.style={%
- nobeforeafter,box align=base,boxsep=0pt,enhanced,sharp corners=all,rounded corners=southeast,%
- boxrule=0.75pt,left=7pt,right=1pt,top=0pt,bottom=0.25pt,%
- }
-}
-
-\tcbset{vignetteMaJ/.style={%
- fontupper={\vphantom{pf}\footnotesize\ttfamily},
- vignettes,colframe=purple!50!black,coltitle=white,colback=purple!10,%
- overlay={\begin{tcbclipinterior}%
- \fill[fill=purple!75]($(interior.south west)$) rectangle node[rotate=90]{\tiny \sffamily{\textcolor{black}{\scalebox{0.66}[0.66]{\textbf{MàJ}}}}} ($(interior.north west)+(5pt,0pt)$);%
- \end{tcbclipinterior}}
- }
-}
-
-\newcommand\Cle[1]{{\small\sffamily\textlangle \textcolor{orange}{#1}\textrangle}}
-\newcommand\cmaj[1]{\tcbox[vignetteMaJ]{#1}\xspace}
-
-\begin{document}
-
-\setlength{\aweboxleftmargin}{0.07\linewidth}
-\setlength{\aweboxcontentwidth}{0.93\linewidth}
-\setlength{\aweboxvskip}{8pt}
-
-\pagestyle{fancy}
-
-\thispagestyle{empty}
-
-\vspace{2cm}
-
-\begin{center}
- \begin{minipage}{0.75\linewidth}
- \begin{tcolorbox}[colframe=yellow,colback=yellow!15]
- \begin{center}
- \begin{tabular}{c}
- {\Huge \texttt{wordle} [fr]}\\
- \\
- {\LARGE Des grilles de Wordle (Sutom),} \\
- \\
- {\LARGE avec \textsf{Ti\textit{k}Z}.} \\
- \end{tabular}
-
- \bigskip
-
- {\small \texttt{Version \TPversion{} -- \TPdate}}
- \end{center}
- \end{tcolorbox}
-\end{minipage}
-\end{center}
-
-\begin{center}
- \begin{tabular}{c}
- \texttt{Cédric Pierquet}\\
- {\ttfamily c pierquet -- at -- outlook . fr}\\
- \texttt{\url{https://github.com/cpierquet/wordle}}
-\end{tabular}
-\end{center}
-
-\vspace{0.25cm}
-
-{$\blacktriangleright$~~Créer des grilles de Wordle/Sutom\footnotemark\footnotetext{\url{https://fr.wikipedia.org/wiki/Wordle}}.}
-
-\vspace{0.25cm}
-
-{$\blacktriangleright$~~Gestion des couleurs, de la taille\footnotemark\footnotetext{Idées venant de \url{ttps://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex}}.
-
-\vspace{1cm}
-
-\begin{center}
-\begin{GrilleSutom}{LUCIOLE}
- LAPINES
- LUMIERE
- LOURDES
- LUCIOLE
-\end{GrilleSutom}
-\end{center}
-
-\medskip
-
-\begin{center}
-\begin{GrilleSutom}[Arrondi=0,Couleurs={lightgray,orange,teal},Style=alt,Unite=0.5,Lettres=false]{REBUS}
- ABRIS
- ROUTE
- RUDES
- REBUS
-\end{GrilleSutom}
-%
-\hspace{5mm}
-%
-\begin{GrilleSutom}[Arrondi=0,Couleurs={lightgray,orange,teal},Style=alt,Unite=0.5]{REBUS}
- ABRIS
- ROUTE
- RUDES
- REBUS
-\end{GrilleSutom}
-\end{center}
-
-\vspace{0.5cm}
-
-%\hfill{}\textit{Merci à Denis Bitouzé et à Gilles Le Bourhis pour leurs retours et idées !}
-
-\smallskip
-
-\vfill
-
-\hrule
-
-\medskip
-
-\TableauDocumentation
-
-\medskip
-
-\hrule
-
-\vspace*{1cm}
-
-\newpage
-
-\phantomsection
-\hypertarget{matoc}{}
-
-\tableofcontents
-
-\vfill
-
-\section{Historique}
-
-\verb|v0.1.0|~:~~~~Correction d'un bug avec la version anglaise.
-
-\verb|v0.1.0|~:~~~~Version initiale.
-
-\newpage
-
-\section{Le package wordle}
-
-\subsection{Le principe du jeu}
-
-\begin{noteblock}
-Wordle est un jeu de lettres en ligne gratuit développé en 2021 par Josh Wardle. Ce jeu est une adaptation directe du jeu télévisé américain Lingo (Motus en France) qui propose de faire deviner un mot par plusieurs tentatives, en indiquant pour chacune d'entre-elles la position des lettres bien placées et mal placées.
-
-Le but du jeu est de deviner un mot spécifique de cinq lettres en un maximum de six tentatives, en tapant des lettres sur un écran de six lignes de cinq cases chacune. La personne qui joue inscrit sur la première ligne un mot de cinq lettres de son choix et entre sa proposition. Après chaque proposition, les lettres apparaissent en couleurs : le fond gris représente les lettres qui ne se trouvent pas dans le mot recherché, le fond jaune représente les lettres qui se trouvent ailleurs dans le mot, et le fond vert représente les lettres qui se trouvent à la bonne place dans le mot à trouver.
-
-\smallskip
-
-\hfill{\scriptsize \url{https://fr.wikipedia.org/wiki/Wordle}}
-\end{noteblock}
-
-\subsection{Le package}
-
-\begin{noteblock}
-Le package propose de quoi afficher, dans son document \LaTeX, une grille de Wordle (ou de Sutom) à l'aide de \TikZ{} et d'une \motcletex!minipage!, avec la possibilité :
-
-\begin{itemize}
- \item de spécifier les dimensions, la couleur ;
- \item de choisir le style des lettres mal placées ;
- \item de personnaliser les bordure et les coins ;
- \item d'afficher ou non les lettres.
-\end{itemize}
-
-Contrairement au jeu \og initial \fg, il est possible de travailler avec des mots de longueur différente de 5 !
-\end{noteblock}
-
-\begin{importantblock}
-Une bonne partie du code, en \hologo{LaTeX3}, est issu d'un fil sur \texttt{tex.stackexchange}, et proposé par l'internaute \textsf{3141592653589793238}.
-\end{importantblock}
-
-\subsection{Chargement du package, packages utilisés}
-
-\begin{importantblock}
-Le package se charge, de manière classique, dans le préambule.
-
-Il n'existe pas d'option pour le package, et \packagetex!xcolor! n'est pas chargé.
-\end{importantblock}
-
-\begin{DemoCode}[listing only]
-\documentclass{article}
-\usepackage{wordle}
-
-\end{DemoCode}
-
-\begin{noteblock}
-\packagetex!wordle! charge les packages suivants :
-
-\begin{itemize}
- \item \packagetex!tikz!;
- \item \packagetex!simplekv! ;
- \item \packagetex!xstring!.
-\end{itemize}
-
-Il est compatible avec les compilations usuelles en \textsf{latex}, \textsf{pdflatex}, \textsf{lualatex} ou \textsf{xelatex}.
-\end{noteblock}
-
-\vfill~
-
-\pagebreak
-
-\section{Environnement GrilleSutom}
-
-\subsection{Fonctionnement global}
-
-\begin{cautionblock}
-L'environnement dédié à la création de la grille du Sutom est \packagetex!GrilleSutom!.
-
-Il fonctionne avec un système de clés, entre \texttt{[...]}, et nécessite de préciser :
-
-\begin{itemize}
- \item le bon mot ;
- \item les différentes propositions.
-\end{itemize}
-
-Le code se charge de mettre en forme (grâce à une \motcletex!minipage!) la grille et les différentes couleurs d'aide.
-\end{cautionblock}
-
-\begin{DemoCode}[listing only]
-\begin{GrilleSutom}[clés]{mot à trouver}
- proposition n°1
- proposition n°2
- proposition n°3
-\end{GrilleSutom}
-\end{DemoCode}
-
-\begin{noteblock}
-Comme indiqué dans l'introduction, la grille est créée à l'aide d'un environnement \motcletex!minipage!, avec gestion automatique de la largeur et des espacements.
-\end{noteblock}
-
-\begin{DemoCode}[]
-%sortie par défaut
-\begin{GrilleSutom}{SUTOM}
- SAUCE
- SAUTS
- SUTOM
-\end{GrilleSutom}
-\end{DemoCode}
-
-\subsection{Clés et options}
-
-\begin{tipblock}
-Le premier argument, optionnel et entre \texttt{[...]}, propose les \Cle{clés} suivantes :
-
-\begin{itemize}
- \item \Cle{Couleurs} : = couleur des cases, sous la forme \Cle{fond,mal placée,bien placée} ;
-
- \hfill{}défaut : \Cle{cyan!75!black,yellow,red},%
- \item \Cle{Arrondi} := arrondi des coins, en mm ; \hfill{}défaut : \Cle{0.1}
- \item \Cle{Unite} := largeur des cases, en cm ; \hfill{}défaut : \Cle{1}
- \item \Cle{Police} := police des lettres ; \hfill{}défaut : \Cle{\textbackslash LARGE\textbackslash bfseries\textbackslash sffamily}
- \item \Cle{CouleurLettres} := couleur des lettres ; \hfill{}défaut : \Cle{white}
- \item \Cle{CouleurBordure} := couleur de la bordure des cases ; \hfill{}défaut : \Cle{white}
- \item \Cle{Lettres} := booléen pour afficher les lettre ; \hfill{}défaut : \Cle{true}
- \item \Cle{Style} := style parmi \Cle{rond / autre} pour changer le style ; \hfill{}défaut : \Cle{rond}
- \item \Cle{Epaisseur} := épaisseur des traits, en mm. \hfill{}défaut : \Cle{0.25}
-\end{itemize}
-\vspace*{-\baselineskip}\leavevmode
-\end{tipblock}
-
-\begin{tipblock}
-Le second argument, obligatoire et entre \texttt{\{...\}} correspond au mot correct à trouver.
-
-\smallskip
-
-Les différentes propositions sont à donner (ligne par ligne ou séparées par des espaces) dans le corps de l'environnement.
-\end{tipblock}
-
-\subsection{Exemples}
-
-\begin{DemoCode}[]
-\begin{GrilleSutom}{BOURDON}
- BALEINE
- BOURBON
- BROMURE
- BOURDON
-\end{GrilleSutom}
-%
-\hspace{5mm}
-%
-\begin{GrilleSutom}[Style=alt]{BOURDON}
- BALEINE BOURBON BROMURE BOURDON
-\end{GrilleSutom}
-\end{DemoCode}
-
-\begin{DemoCode}[]
-\begin{GrilleSutom}
- [Style=alt,Epaisseur=0.3,CouleurBordure=black,%
- Couleurs={lightgray,orange,teal}]%
- {BOURDON}
- BALEINE BOURBON BROMURE BOURDON
-\end{GrilleSutom}
-%
-\hspace{5mm}
-%
-\begin{GrilleSutom}
- [Arrondi=0,Epaisseur=0.3,CouleurBordure=black,%
- Couleurs={lightgray,orange,teal}]%
- {BOURDON}
- BALEINE BOURBON BROMURE BOURDON
-\end{GrilleSutom}
-\end{DemoCode}
-
-\begin{DemoCode}[]
-\begin{GrilleSutom}[Unite=2,Police=\Huge\ttfamily,CouleurLettres=black]{BOURDON}
- BALEINE
- BOURBON
- BROMURE
- BOURDON
-\end{GrilleSutom}
-\end{DemoCode}
-
-\begin{DemoCode}[]
-\begin{GrilleSutom}%
- [Unite=0.75,Arrondi=0,Couleurs={cyan,orange,violet},%
- Style=alt,Lettres=false]{REBUS}
- ABRIS
- ROUTE
- RUDES
- REBUS
-\end{GrilleSutom}
-\hspace{5mm}
-\begin{GrilleSutom}%
- [Unite=0.75,Arrondi=0,Couleurs={cyan,orange,violet},Style=alt]{REBUS}
- ABRIS
- ROUTE
- RUDES
- REBUS
-\end{GrilleSutom}
-\end{DemoCode}
-
-\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/wordle/tex/wordle.sty b/graphics/pgf/contrib/wordle/tex/wordle.sty
deleted file mode 100644
index 4df1801ba0..0000000000
--- a/graphics/pgf/contrib/wordle/tex/wordle.sty
+++ /dev/null
@@ -1,298 +0,0 @@
-% Author.........: C. Pierquet
-% licence........: Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
-% Inspiration....: https://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex
-
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{wordle}[2023/09/03 v0.1.1 Wordle grid]
-% 0.1.1 Coorection d'un bug sur la version anglaise
-% 0.1.0 Version initiale + quelques modèles
-
-%------Packages utiles
-\RequirePackage{tikz}
-\RequirePackage{simplekv}
-\RequirePackage{xstring}
-
-%commandes utiles
-\usepackage{expl3}
-\ExplSyntaxOn
-
-%boite en [fr]
-\cs_new:Npn \l__sutom_boite_lettre:nn #1#2#3
-{
- \ifboolKV[SUTOM]{Lettres}%
- {%
- \tikz \draw[rounded~corners=\fpeval{#3*\SutomUnit}cm,draw=\SutomBorder,line~width=\SutomWidth~mm,fill=#1] (0,0) rectangle++ (\SutomUnit,\SutomUnit) node[midway,font=\SutomFonte,text=\SutomFonteColor,scale=\SutomUnit] {#2} ;
- }%
- {%
- \tikz \draw[rounded~corners=\fpeval{#3*\SutomUnit}cm,draw=\SutomBorder,line~width=\SutomWidth~mm,fill=#1] (0,0) rectangle++ (\SutomUnit,\SutomUnit) ;
- }%
-}
-
-\cs_new:Npn \l__sutom_boite_lettre_rond:nn #1#2#3#4
-{
- \IfStrEq{\SutomStyle}{rond}
- {%
- \tikz {\draw[rounded~corners=\fpeval{#4*\SutomUnit}cm,draw=\SutomBorder,line~width=\SutomWidth~mm,fill=#1] (0,0) rectangle++ (\SutomUnit,\SutomUnit) ;
- \ifboolKV[SUTOM]{Lettres}%
- {%
- \draw[line~width=\SutomWidth~mm,draw=#2,fill=#2] ({0.5*\SutomUnit},{0.5*\SutomUnit}) circle[radius=\fpeval{0.5*\SutomUnit-0.1*\SutomWidth}] node[font=\SutomFonte,text=\SutomFonteColor,scale=\SutomUnit] {#3} ;
- }%
- {%
- \draw[line~width=\SutomWidth~mm,draw=#2,fill=#2] ({0.5*\SutomUnit},{0.5*\SutomUnit}) circle[radius=\fpeval{0.5*\SutomUnit-0.1*\SutomWidth}];
- }%
- }%
- }%
- {%
- \ifboolKV[SUTOM]{Lettres}%
- {%
- \tikz \draw[rounded~corners=\fpeval{#4*\SutomUnit}cm,line~width=0\SutomWidth~mm,draw=\SutomBorder,fill=#2] (0,0) rectangle++ (\SutomUnit,\SutomUnit) node[midway,font=\SutomFonte,text=\SutomFonteColor,scale=\SutomUnit] {#3} ;
- }%
- {%
- \tikz \draw[rounded~corners=\fpeval{#4*\SutomUnit}cm,line~width=\SutomWidth~mm,draw=\SutomBorder,fill=#2] (0,0) rectangle++ (\SutomUnit,\SutomUnit) ;
- }%
- }%
-}
-
-%boite en [en]
-\cs_new:Npn \l__wordle_boite_lettre:nn #1#2#3
-{
- \ifboolKV[WORDLE]{Letters}%
- {%
- \tikz \draw[rounded~corners=\fpeval{#3*\SutomUnit}cm,draw=\SutomBorder,line~width=\SutomWidth~mm,fill=#1] (0,0) rectangle++ (\SutomUnit,\SutomUnit) node[midway,font=\SutomFonte,text=\SutomFonteColor,scale=\SutomUnit] {#2} ;
- }%
- {%
- \tikz \draw[rounded~corners=\fpeval{#3*\SutomUnit}cm,draw=\SutomBorder,line~width=\SutomWidth~mm,fill=#1] (0,0) rectangle++ (\SutomUnit,\SutomUnit) ;
- }%
-}
-
-\cs_new:Npn \l__wordle_boite_lettre_rond:nn #1#2#3#4
-{
- \IfStrEq{\SutomStyle}{default}
- {%
- \ifboolKV[WORDLE]{Letters}%
- {%
- \tikz \draw[rounded~corners=\fpeval{#4*\SutomUnit}cm,line~width=\SutomWidth~mm,draw=\SutomBorder,fill=#2] (0,0) rectangle++ (\SutomUnit,\SutomUnit) node[midway,font=\SutomFonte,text=\SutomFonteColor,scale=\SutomUnit] {#3} ;
- }%
- {%
- \tikz \draw[rounded~corners=\fpeval{#4*\SutomUnit}cm,line~width=\SutomWidth~mm,draw=\SutomBorder,fill=#2] (0,0) rectangle++ (\SutomUnit,\SutomUnit) ;
- }%
- }%
- {%
- \tikz {\draw[rounded~corners=\fpeval{#4*\SutomUnit}cm,draw=\SutomBorder,line~width=\SutomWidth~mm,fill=#1] (0,0) rectangle++ (\SutomUnit,\SutomUnit) ;
- \ifboolKV[WORDLE]{Letters}%
- {%
- \draw[line~width=\SutomWidth~mm,draw=#2,fill=#2] ({0.5*\SutomUnit},{0.5*\SutomUnit}) circle[radius=\fpeval{0.5*\SutomUnit-0.1*\SutomWidth}] node[font=\SutomFonte,text=\SutomFonteColor,scale=\SutomUnit] {#3} ;
- }%
- {%
- \draw[line~width=\SutomWidth~mm,draw=#2,fill=#2] ({0.5*\SutomUnit},{0.5*\SutomUnit}) circle[radius=\fpeval{0.5*\SutomUnit-0.1*\SutomWidth}];
- }%
- }%
- }%
-}
-
-\seq_new:N \l_wordle_seq % the answer
-\prop_new:N \l_wordle_prop % count letters in wordle
-\seq_new:N \l_words_seq % list of all words
-\prop_new:N \l_word_prop % count letters in word
-\int_new:N \l_letter_int % index of current letter in word
-
-% a conditional for nonnegative prop counter in \l_word_prop
-\prg_new_protected_conditional:Npnn \if_wordle_letter_nonnegative:n #1 {TF}
-{
- \prop_if_in:NnTF \l_word_prop {#1}
- { % letter in in prop
- \prop_get:NnN \l_word_prop {#1} \l_tmpa_tl
- \int_compare:nNnTF {\l_tmpa_tl} < {0}
- {\prg_return_false:} {\prg_return_true:}
- }
- {\prg_return_false:}
-}
-
-% a conditional for comparing letters
-\prg_new_protected_conditional:Npnn \if_wordle_letters_agree:n #1 {T, TF}
-{
- \str_set:Nx \l_tmpa_str {\seq_item:Nn \l_wordle_seq {\l_letter_int}}
- \str_if_eq:nVTF {#1} \l_tmpa_str {\prg_return_true:} {\prg_return_false:}
-}
-
-% add #3 to <prop=#1>.#2
-\cs_new_protected:Npn \wordle__add_to_prop_counter:Nnn #1#2#3
-{
- \prop_put_if_new:Nnn #1 {#2} {0}
- \prop_pop:NnN #1 {#2} \l_tmp_a
- \prop_put:Nnx #1 {#2} {\int_eval:n {#3+\l_tmp_a}}
-}
-
-% make \l_wordle_prop<x> = #x's in wordle_seq
-\cs_new_protected:Npn \count_letters_in_wordle:n #1
-{
- \wordle__add_to_prop_counter:Nnn \l_wordle_prop {#1} {1}%
-}
-
-% first run: subtract correct matches from letter counts
-\cs_new:Npn \count_letters_in_word:n #1
-{
- \int_incr:N \l_letter_int
- \if_wordle_letters_agree:nT {#1}
- { \wordle__add_to_prop_counter:Nnn \l_word_prop {#1} {-1} }%
-}
-
-%commande [fr]
-% on the second run we print a coloured wordle word
-\cs_new:Npn \write_letters_in_word:n #1
-{
- \int_incr:N \l_letter_int
- \if_wordle_letters_agree:nTF {#1}
- { \l__sutom_boite_lettre:nn {\SutomBienPlacee}{#1}{\SutomRounded} }
- {
- % subtract 1 from the prop counter
- \wordle__add_to_prop_counter:Nnn \l_word_prop {#1} {-1}
- % if the counter is non-negative this is a pseudo match
- \if_wordle_letter_nonnegative:nTF {#1}
- { \l__sutom_boite_lettre_rond:nn {\SutomCoulFond}{\SutomCoulMalPlacee}{#1}{\SutomRounded} }
- { \l__sutom_boite_lettre:nn {\SutomCoulFond}{#1}{\SutomRounded} }
- }%
-}
-
-%commande [en]
-% on the second run we print a coloured wordle word
-\cs_new:Npn \write_letters_in_wordle:n #1
-{
- \int_incr:N \l_letter_int
- \if_wordle_letters_agree:nTF {#1}
- { \l__wordle_boite_lettre:nn {\SutomBienPlacee}{#1}{\SutomRounded} }
- {
- % subtract 1 from the prop counter
- \wordle__add_to_prop_counter:Nnn \l_word_prop {#1} {-1}
- % if the counter is non-negative this is a pseudo match
- \if_wordle_letter_nonnegative:nTF {#1}
- { \l__wordle_boite_lettre_rond:nn {\SutomCoulFond}{\SutomCoulMalPlacee}{#1}{\SutomRounded} }
- { \l__wordle_boite_lettre:nn {\SutomCoulFond}{#1}{\SutomRounded} }
- }%
-}
-
-%clés [fr]
-\defKV[SUTOM]{%
- Couleurs=\def\SutomCouleurs{#1},%
- Arrondi=\def\SutomRounded{#1},%
- Unite=\def\SutomUnit{#1},%
- Police=\def\SutomFonte{#1},%
- CouleurLettres=\def\SutomFonteColor{#1},%
- Style=\def\SutomStyle{#1},%
- Epaisseur=\def\SutomWidth{#1},%
- CouleurBordure=\def\SutomBorder{#1}
-}
-
-\setKVdefault[SUTOM]{%
- Couleurs={cyan!75!black,yellow,red},%
- Arrondi=0.1,%
- Unite=1,%
- Police=\LARGE\bfseries\sffamily,%
- CouleurLettres=white,%
- Lettres=true,%
- Style=rond,%
- Epaisseur=0.25,%
- CouleurBordure=white
-}
-
-%environnement [fr]
-\NewDocumentEnvironment{GrilleSutom}{ O{} m b }%
-{%
- \restoreKV[SUTOM]%
- \setKV[SUTOM]{#1}%
- \StrBefore{\SutomCouleurs}{,}[\SutomCoulFond]%
- \StrBetween[1,2]{\SutomCouleurs}{,}{,}[\SutomCoulMalPlacee]%
- \StrBehind[2]{\SutomCouleurs}{,}[\SutomBienPlacee]%
- \StrLen{#2}[\SutomNbLettres]%
- \def\SutomLarg{\fpeval{1.01*\SutomUnit*\SutomNbLettres}}%
- \begin{minipage}{\SutomLarg~cm}
- \lineskip=0pt%
- \parindent=0pt%
- % split the answer into letters
- \seq_set_split:Nnn \l_wordle_seq {} {#2}
- % we need to count the number of times each letter appears in \l_wordle_seq
- \prop_clear:N \l_wordle_prop
- \tl_map_function:nN {#2} \count_letters_in_wordle:n
- % split the solution into words
- \regex_split:nnN {\s} {#3} \l_words_seq
- % process the words
- \seq_map_inline:Nn \l_words_seq
- {
- \int_zero:N \l_letter_int
- \prop_set_eq:NN \l_word_prop \l_wordle_prop
- \tl_map_function:nN {##1} \count_letters_in_word:n
- \int_zero:N \l_letter_int
- \tl_map_function:nN {##1} \write_letters_in_word:n
- \par
- }
-}%
-{%
- \end{minipage}%
-}
-
-%clés [en]
-\definecolor{WordleBack}{HTML}{797D7F}
-\definecolor{WordleBad}{HTML}{CAB557}
-\definecolor{WordleGood}{HTML}{6AAB64}
-
-\defKV[WORDLE]{%
- Colors=\def\SutomCouleurs{#1},%
- Rounded=\def\SutomRounded{#1},%
- Unit=\def\SutomUnit{#1},%
- Fonte=\def\SutomFonte{#1},%
- ColorLetters=\def\SutomFonteColor{#1},%
- Style=\def\SutomStyle{#1},%
- Thickness=\def\SutomWidth{#1},%
- BorderColor=\def\SutomBorder{#1}
-}
-
-\setKVdefault[WORDLE]{%
- Colors={WordleBack,WordleBad,WordleGood},%
- Rounded=0.1,%
- Unit=1,%
- Fonte=\LARGE\bfseries\sffamily,%
- CouleurLettres=white,%
- Letters=true,%
- Style=default,%
- Thick=0.25,%
- BorderColor=white
-}
-
-%environnement [en]
-\NewDocumentEnvironment{WordleGrid}{ O{} m b }
-{%
- \restoreKV[WORDLE]%
- \setKV[WORDLE]{#1}%
- \StrBefore{\SutomCouleurs}{,}[\SutomCoulFond]%
- \StrBetween[1,2]{\SutomCouleurs}{,}{,}[\SutomCoulMalPlacee]%
- \StrBehind[2]{\SutomCouleurs}{,}[\SutomBienPlacee]%
- \StrLen{#2}[\SutomNbLettres]%
- \def\SutomLarg{\fpeval{1.01*\SutomUnit*\SutomNbLettres}}%
- \begin{minipage}{\SutomLarg~cm}
- \parindent=0pt
- \lineskip=0pt
- % split the answer into letters
- \seq_set_split:Nnn \l_wordle_seq {} {#2}
- % we need to count the number of times each letter appears in \l_wordle_seq
- \prop_clear:N \l_wordle_prop
- \tl_map_function:nN {#2} \count_letters_in_wordle:n
- % split the solution into words
- \regex_split:nnN {\s} {#3} \l_words_seq
- % process the words
- \seq_map_inline:Nn \l_words_seq
- {
- \int_zero:N \l_letter_int
- \prop_set_eq:NN \l_word_prop \l_wordle_prop
- \tl_map_function:nN {##1} \count_letters_in_word:n
- \int_zero:N \l_letter_int
- \tl_map_function:nN {##1} \write_letters_in_wordle:n
- \par
- }
-}%
-{%
- \end{minipage}%
-}
-
-\ExplSyntaxOff
-
-\endinput \ No newline at end of file
diff --git a/graphics/pgf/contrib/wordle/wordle-doc-en.pdf b/graphics/pgf/contrib/wordle/wordle-doc-en.pdf
new file mode 100644
index 0000000000..7845bc31b5
--- /dev/null
+++ b/graphics/pgf/contrib/wordle/wordle-doc-en.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/wordle/wordle-doc-en.tex b/graphics/pgf/contrib/wordle/wordle-doc-en.tex
new file mode 100644
index 0000000000..a638ed9496
--- /dev/null
+++ b/graphics/pgf/contrib/wordle/wordle-doc-en.tex
@@ -0,0 +1,921 @@
+% !TeX TS-program = pdflatex
+
+\documentclass[svgnames]{report}
+\usepackage{wordle}
+\usepackage{manfnt}
+\usepackage{enumitem}
+\setlist[description]{font=\sffamily\bfseries\color{ForestGreen},labelwidth=\textwidth}
+\usepackage{booktabs}
+\usepackage[a4paper,margin=18mm]{geometry}
+\synctex=1
+\parindent=0pt
+\parskip=2mm
+
+\usepackage{cmap} % fix search and cut-and-paste in Acrobat
+\setcounter{secnumdepth}{0}
+
+\usepackage{listings}\lstset{language=[LaTeX]TeX,framerule=2pt}
+\lstset{language=[LaTeX]TeX,
+ texcsstyle=*\bfseries\color{Peru},
+ backgroundcolor=\color{Ivory},
+ numbers=none,
+ breaklines=true,
+ keywordstyle=\color{Sienna},
+ commentstyle=\color{BurlyWood},
+ tabsize=2,
+ morekeywords={Wordle,wordle,GrilleSutom},
+ resetmargins=true,
+}
+% hyperref links to ctan
+\newcommand\ctan[1]{\href{https://www.ctan.org/pkg/#1}{\texttt{#1}}}
+
+\newcommand\Section[1]{\subsection{\textcolor{DarkGreen}{#1}}}
+
+\ExplSyntaxOn
+\NewDocumentCommand\option{ omo }{%
+ \IfNoValueTF{#1}{\textsf{#2}}
+ {%
+ \textbf{\textcolor{Crimson}{#2}}
+ \str_if_empty:nF {#1}{~(default:~\textcolor{DarkRed}{#1})}%
+ \IfNoValueF{#3}{\hfill\textcolor{Gray}{[accepts:~#3]}}%
+ }%
+ \index{#2}%
+}
+\ExplSyntaxOff
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage{imakeidx}
+\indexsetup{level=\section*, toclevel=section, noclearpage}
+\makeindex[intoc,columns=3]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage[skins,listings]{tcolorbox}
+\usetikzlibrary{backgrounds, shapes.geometric} % for tikz={framed,...}
+
+\DeclareTotalTCBox\keyword{ O{} v }{
+ fontupper=\sffamily,
+ nobeforeafter,
+ skin=tile,
+ verbatim,
+ on line,
+ tcbox raise base,
+ top=0pt,bottom=0pt,left=0mm,right=0mm,
+ colback=OldLace,
+ colupper=ForestGreen,
+ #1}
+{#2}
+
+\lstdefinestyle{tikz}{style=tcblatex,
+ classoffset=0,
+ texcsstyle=*\color{DarkGoldenrod},%
+ deletetexcs={begin, end},
+ moretexcs={,%
+ node,
+ draw,
+ true,
+ false
+ },%
+ classoffset=1,
+ keywordstyle=\color{ForestGreen},%
+ morekeywords={wordle,GrilleSutom},
+ classoffset=2,
+ keywordstyle=\color{Crimson},%
+ morekeywords={
+ absent,
+ align,
+ border,
+ borders,
+ case,
+ color,
+ colors,
+ colour,
+ colours,
+ correct,
+ empty,
+ font,
+ frame,
+ frames,
+ letters,
+ lower,
+ name,
+ natural,
+ noalign,
+ noletters,
+ params,
+ present,
+ rounded,
+ rows,
+ scale,
+ sensitive,
+ separation,
+ shape,
+ shapes,
+ size,
+ strict,
+ style,
+ style,
+ text,
+ thickness,
+ tikz,
+ tile,
+ upper,
+ },
+ classoffset=3,
+ keywordstyle=\color{DarkOrange},%
+ morekeywords={
+ hard,
+ standard,
+ sutom,
+ }
+}
+
+\DeclareTCBListing{example}{ !O{} }{%
+ skin=bicolor,
+ colframe=MediumSeaGreen,
+ colbacklower=OldLace,
+ colback=LawnGreen!20,
+ lefthand width=50mm,
+ listing style=tikz,
+ sidebyside,
+ sidebyside align=center,
+ sidebyside gap=4mm,
+ text and listing,
+ text outside listing,
+ boxsep = 0pt,
+ #1
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\makeatletter
+\author{Andrew Mathas and Cédric Pierquet}
+\usepackage{tikz}
+\usetikzlibrary{shadows.blur}
+\tikzset{shadowed/.style={blur shadow={shadow blur steps=5},
+ bottom color=ForestGreen!30,
+ draw=MediumSeaGreen!70,
+ shade,
+ font=\normalfont\Huge\bfseries\scshape,
+ rounded corners=8pt,
+ top color=SeaGreen,
+ },
+ boxes/.style={draw=SeaGreen,
+ fill=Cornsilk,
+ font=\sffamily\small,
+ inner sep=5pt,
+ rectangle,
+ rounded corners=8pt,
+ text=DarkGreen,
+ }
+}
+\newcommand\Wordle{%
+ \begin{tikzpicture}[remember picture,overlay]
+ \node[yshift=-3cm] at (current page.north west)
+ {\begin{tikzpicture}[remember picture, overlay]
+ \draw[shadowed](30mm,0) rectangle node[white]{wordle} (\paperwidth-30mm,16mm);
+ \node[anchor=west,boxes] at (4cm,0cm) {\@author};
+ \node[anchor=east,boxes] at (\paperwidth-4cm,0) {Version \wordle@version};
+ \end{tikzpicture}
+ };
+ \end{tikzpicture}
+ \vspace*{20mm}
+}
+
+\def\@oddfoot{\textsc{Wordle} --- \wordle@version~(released~\wordle@release)\hfill\thepage}
+
+\usepackage[colorlinks=true,linkcolor=blue,urlcolor=MediumBlue]{hyperref}
+\hypersetup{
+ pdfcreator={ Generated by pdfLaTeX },
+ pdfinfo={
+ Author ={ Andrew Mathas and Cédric Pierquet},
+ Keywords={ wordle },
+ License ={ LaTeX Project Public License v1.3c or later },
+ Subject ={ LaTeXing Wordle puzzles },
+ Title ={ Wordle - \wordle@version }
+ },
+}
+\makeatother
+
+\begin{document}
+
+ \Wordle
+
+ This package provides a stupidly feature-rich way of creating
+ \keyword{Wordle} puzzles in \LaTeX, which
+ \href{https://en.wikipedia.org/wiki/Wordle}{Wikipedia} describes as a
+ hugely popular web-based word game created and developed by Welsh
+ software engineer Josh Wardle. This package is an enhanced version of
+ one of the solutions to a question asked by \textcolor{FireBrick}{valerio\_new}
+ on
+ \href{https://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex/660056#660056}{tex.stackexchange.com}.
+
+ This package provides the \keyword{wordle} environment, which uses the
+ syntax:
+
+ \begin{tcblisting}{
+ listing only,
+ skin=bicolor,
+ colframe=MediumSeaGreen,
+ colbacklower=OldLace,
+ colback=LawnGreen!20,
+ listing style=tikz,
+ boxsep = 0pt,
+ }
+ % \usepackage{wordle}
+ \begin{wordle}[wordle settings]{solution}[optional tikz commands]
+ guess1 guess2 ...
+ \end{wordle}
+ \end{tcblisting}
+ \index{environment!wordle}
+ \index{wordle}
+
+ and the \keyword{GrilleSutom} environment, for \keyword{Sutom}, the French version of
+ the games:
+
+ \begin{tcblisting}{
+ listing only,
+ skin=bicolor,
+ colframe=MediumSeaGreen,
+ colbacklower=OldLace,
+ colback=LawnGreen!20,
+ listing style=tikz,
+ boxsep = 0pt,
+ }
+ % \usepackage{wordle}
+ \begin{GrilleSutom}[sutom settings]{solution}[optional TikZ commands]
+ guess1 guess2 ...
+ \end{GrilleSutom}
+ \end{tcblisting}
+ \index{environment!GrilleSutom}
+ \index{GrilleSutom}
+ \index{sutom}
+
+ The words in the puzzle can be entered on a single lines, or on separate
+ lines. Here are some examples:
+
+ \begin{example}
+ \begin{wordle}{ANVIL}
+ % English version of sutom (wordle)
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ \begin{example}
+ % French version of wordle (sutom)
+ \begin{GrilleSutom}{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ As in the online puzzles, the \keyword{wordle} environment
+ automatically colours the letter tiles
+ \keyword[colback=WordleCorrect,colupper=White]{green}
+ when the letter is in the same position as the solution, and as
+ \keyword[colback=WordlePresent,colupper=White]{gold} when
+ the letter is in the solution but it is not in the correct position.
+ Similarly, \keyword{GrilleSutom} colours the correct letters
+ \keyword[colback=WordleSutomCorrect,colupper=White]{red}
+ and the present letters
+ \keyword[colback=WordleSutomPresent,colupper=White]{gold}.
+ As described below, these colours can be changed to suit your tastes.
+
+ The number of letters in the puzzle is determined by the solution,
+ being constrained only by the page width.
+
+ \begin{example}
+ \begin{wordle}[rows=4]{orange}
+ normal
+ orders
+ orange
+ \end{wordle}
+ \end{example}
+
+ The letters in the puzzle can be entered in upper case, lower case, or
+ mixed case. By default, the case of the letters is ignored when
+ determining the colours of the letter tiles.
+
+ As described below, the \keyword{wordle} and \keyword{GrilleSutom}
+ environments accept an array of different options that change the
+ colours, fonts, and shapes of the tile. In addition, you can the case
+ sensitivity of the environments, add extra rows to the puzzle, disable
+ special formatting of the \textit{letter tiles}. These options are
+ given as a comma separated list key-value pairs. They can be set
+ locally, using the optional argument of the \keyword|wordle|
+ environment, or they can be set globally (more accurately, in the
+ current \LaTeX\ group) using the \keyword{\WordleSetup} command
+ \index{\textbackslash WordleSetup}, or as global package options, via
+ \keyword{\usepackage[options]{wordle}}. The order of the options does
+ not matter, except that later options take precedence over earlier
+ ones, with the exception of \option{tikz} and \option{tile style} keys
+ which are always applied last.
+
+ The \keyword{wordle} puzzles are drawn using \ctan{TikZ}, with each
+ letter in the puzzle sitting inside a \ctan{TikZ} node. Many of the
+ options control the settings of these nodes.
+
+ The descriptions of the options below are grouped according to their
+ function.
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Wordle styles}
+
+ The \option{style} key can be used to change many characteristics of
+ the tiles in a \keyword{wordle} puzzle, including their colours, the
+ fonts and so on. The more common settings can be setting using the
+ \option{style} keyword. \textit{The style should always be set first
+ because, otherwise, the style settings may override earlier settings.}
+
+ The following styles are supported:
+
+ \textcolor{DarkOrange}{sutom}
+ \index{style!sutom}
+ \index{sutom}
+
+ \begin{example}
+ \begin{wordle}[style=sutom]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ The \textcolor{DarkOrange}{sutom} style is the default
+ style for the \keyword{GrilleSutom} environment.
+
+ \textcolor{DarkOrange}{standard}
+ \index{style!standard}
+
+ \begin{example}
+ \begin{wordle}[style=standard]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ The \textcolor{DarkOrange}{standard} style is the default style for the
+ \keyword{wordle} environment.
+
+ \textcolor{DarkOrange}{hard}
+ \index{style!hard}
+
+ \begin{example}
+ \begin{wordle}[style=hard]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Options for the individual styles of the letter tiles}
+
+ There are four types of letter tiles in \keyword{wordle}:
+ \option{absent}, \option{present}, \option{correct} and
+ \option{empty}, corresponding to letters not in the solution,
+ incorrectly placed letters, correctly placed letters, and empty
+ tiles, respectively. The options in this section can be used to set
+ the text, tile and border colours, shapes, and frames of these tiles.
+
+ The letter tiles in a \keyword{wordle} environment are typeset inside
+ a \ctan{TikZ} \keyword{\node}. The options below control the different
+ style settings of these nodes.
+
+ \option[--]{colours}[comma separated list of valid colours]
+
+ The \option{colours} option is a short-hand for specifying the colours
+ of the \option{absent}, \option{present}, \option{correct} and
+ \option{empty} tiles, in that order. Later colours can be omitted but
+ the colours should be given in this order, from left to right.
+ If only one colour is given then this colour is applied to all tiles.
+
+ \begin{example}
+ \begin{wordle}[colours={LightGray,Orange,Teal}]{cellar}
+ pounds
+ taylor
+ cellar
+ \end{wordle}
+ \end{example}
+
+ The colours can also be set individually using \option{absent colour},
+ \option{present colour}, \option{correct colour} and \option{empty
+ colour}. To support north American dialects, is also possible to use
+ \option{colors}, \option{absent color}, \option{present color},
+ \option{correct color} and \option{empty color}.
+
+ \begin{example}
+ \begin{wordle}[absent colour=DarkGray,present color=Salmon,
+ correct color=SeaGreen]{cellar}
+ pounds
+ taylor
+ cellar
+ \end{wordle}
+ \end{example}
+
+ \option[white]{borders}[comma separated list of valid colours]
+
+ Similar to the \option{colours} option, this is a short-hand for the
+ setting border colour of the \option{absent}, \option{present},
+ \option{correct} and \option{empty} tiles, in that order.
+ If only one colour is given then this colour is applied to all tiles.
+
+ \begin{example}
+ \begin{wordle}[borders={red, orange,blue}]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ You can set the border borders of the individual tiles using
+ \option{absent border}, \option{present border}, \option{correct
+ border} and \option{empty border}
+
+ \option[false]{frames}[comma separated list of true/false]
+
+ This is a short-hand for adding a rectangular frame around the
+ \option{absent}, \option{present}, \option{correct} and \option{empty}
+ tiles, in that order, with the same background colour as the
+ \option{absent} file. This is only useful for non-square tiles.
+
+ \begin{example}
+ \begin{wordle}[frames={false,true,true}, shapes=circle]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ You can set the frames of the individual tiles using
+ \option{absent frame}, \option{present frame},
+ \option{correct frame} and \option{empty~frame}.
+
+ \option[rectangle]{shapes}[comma separated list of TikZ shapes]
+
+ Similar to the \option{colours} option, this is a short-hand for the
+ setting shape colour of the \option{absent}, \option{present},
+ \option{correct} and \option{empty} tiles, in that order.
+
+ \begin{example}
+ \begin{wordle}[shapes={circle, rectangle, circle}]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ You can set the shape shapes of the individual tiles using
+ \option{absent shape}, \option{present shape},
+ \option{correct shape} and \option{empty shape}
+ You can use the shapes provided by the \ctan{TikZ}
+ \texttt{shapes.geometric} package, including \texttt{diamond},
+ \texttt{ellipse}, \texttt{trapezium} and \texttt{star}; see
+ section~71.2 of the \ctan{TikZ} manual.
+
+ \begin{example}
+ % \usepackage{shapes.geometric}
+ \begin{wordle}[shapes={diamond, ellipse, star}]{LADLE}
+ FLAIL
+ LAPEL
+ *
+ LADLE
+ LOVER
+ \end{wordle}
+ \end{example}
+
+ \option[white]{text}[comma separated list of valid colours]
+
+ This is a short-hand for the setting the text colours of the
+ \option{absent}, \option{present}, \option{correct} and \option{empty}
+ tiles, in that order.
+
+ \begin{example}
+ \begin{wordle}[text={red, orange,blue}]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ You can set the text borders of the individual tiles using
+ \option{absent text}, \option{present border}, \option{correct
+ text} and \option{empty border}
+
+
+ \Section{Common tile characteristics}
+
+ The following options apply to all tiles.
+
+ \option[]{noalign} (default) \qquad
+ \option[]{align}
+
+ The options tweak the vertical alignment of the letters in each row of
+ the puzzle. This is only likely to be useful if you have lower case
+ letters in your puzzle.
+
+ \begin{example}
+ \begin{wordle}[align]{agony}
+ groan
+ angry
+ agony
+ \end{wordle}
+ \end{example}
+
+ \begin{example}
+ \begin{wordle}[noalign]{agony} % the default
+ groan
+ angry
+ agony
+ \end{wordle}
+ \end{example}
+
+ \option[\textbackslash Large\textbackslash bfseries\textbackslash sffamily]{font}
+ [LaTeX font specification]
+
+ Sets the font used by all \keyword{wordle} letters. Any valid sequence
+ of \LaTeX\ font commands can be used.
+
+ \begin{example}
+ \begin{wordle}[font=\large\sffamily]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ \option[1mm]{rounded}[a length]
+
+ Set TikZ \texttt{rounded corners} key for the \keyword{wordle} letter tiles.
+
+ \begin{example}
+ \begin{wordle}[rounded=2mm]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ \option[0.5mm]{separation}[a length]
+
+ Sets the separation distance between the \keyword{wordle} letter
+ tiles.
+
+ \begin{example}
+ \begin{wordle}[separation=2mm, borders=black]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ \option[1]{scale}[a number]
+
+ The \option{scale} option rescales the \keyword{wordle} environment.
+ The \option{scale} alters the dimensions sets by the \option{rounded},
+ \option{separation} \option{size} and \option{thickness} options. If
+ you change the scale, then you will almost certainly want
+ to change font size font as well, which you can do using the
+ \option{font} option:
+
+ \begin{example}
+ \begin{wordle}[scale=1.5, font=\huge\bfseries]{SIZE}
+ HELP
+ WISE
+ SIZE
+ \end{wordle}
+ \end{example}
+
+ \option[8mm]{size}[a length]
+
+ The \option{size} option sets the size of the \keyword{wordle} letter
+ tiles. Unlike the \option{scale} option, \option{size} only changes
+ the dimensions of the letter tiles.
+
+ \begin{example}
+ \begin{wordle}[size=10mm, font=\huge\bfseries]{LADLE}
+ FLAIL LAPEL * LADLE
+ \end{wordle}
+ \end{example}
+
+ \option[0.25mm]{thickness}[a length]
+
+ Sets the border thickness of the \keyword{wordle} letter tiles. By
+ default, the borders of the tiles are white, which makes this setting
+ hard to see, so the following example changes the border to red.
+
+ \begin{example}
+ \begin{wordle}[thickness=1mm, borders=red]{LADLE}
+ FLAIL
+ LAPEL
+ LADLE
+ \end{wordle}
+ \end{example}
+
+ \option[--]{tile style}[comma separated list of TikZ style keys]
+
+ A comma-separated list of \ctan{Tikz} node keys that are appended to
+ the style of the \ctan{TikZ} node that contains each of the
+ \keyword{wordle} letters. Some of the options given above can be set
+ directly using the \option{tile style} option. When using the
+ \option{tile style}, be careful not to break the special formatting of
+ letters provided by the \keyword{wordle} environment.\par
+
+ With most of the \keyword{wordle} options, the latter options take
+ precedence, however, the \option{tile style} option is applied last,
+ so it overrides any competing options.
+
+ % TODO: Fix this because it looks like this style is being applied
+ % twice because the PDF file shows a rotation of 90 = 2*45...
+ \begin{example}
+ \begin{wordle}[tile style={rotate=45}]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Extra rows and columns}
+
+ By default, all of the words in a \keyword{wordle} puzzle are assumed
+ to have the same number of letters as the solution, and the number of
+ rows in the puzzle is number of words given in the environment. The
+ options below give more control over the number of rows and columns in
+ the puzzle.
+
+ \option[]{letters} (default)\qquad
+ \option[]{noletters}
+
+ By default, the letters in the puzzle are printed. You can hide the
+ letters from the puzzle, while still keeping the \keyword{wordle} tile
+ colouring, using \option{noletters}.
+
+ \begin{example}
+ \begin{wordle}[letters]{CRAZE} % the default
+ TRACE
+ CREAM
+ CRAZE
+ \end{wordle}
+ \end{example}
+
+ \begin{example}
+ \begin{wordle}[noletters]{CRAZE}
+ TRACE
+ CREAM
+ CRAZE
+ \end{wordle}
+ \end{example}
+
+ \option[false]{strict}[true/false/--]
+
+ By default, the \keyword{wordle} environment does not check that each
+ word in the puzzle has the same length as the solution, so missing
+ and extra letters receive no special processing.
+
+ \begin{example}
+ \begin{wordle}[strict=false]{CRAZE} % the default
+ GRAIL
+ CRAMPS
+ CRAM
+ CRABS
+ \end{wordle}
+ \end{example}
+
+ The \option{strict} option enforces the word length in the puzzle by
+ marking missing letters as incorrect and striking out extra letters.
+
+ \begin{example}
+ \begin{wordle}[strict]{CRAZE}
+ GRAIL
+ CRAMPS
+ CRAM
+ CRABS
+ \end{wordle}
+ \end{example}
+
+ \option[--]{rows}
+
+ By default, a \keyword{wordle} environment displays the words
+ in the puzzle environment with one word per row. You can add extra
+ (blank) rows to the puzzle with the \option{rows} option.
+
+ \begin{example}
+ \begin{wordle}[rows=4]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ The \option{rows} option only adds extra rows to the puzzle if they
+ are needed. This option does not prevent ``extra'' rows from
+ appearing.
+
+ \begin{example}
+ \begin{wordle}[rows=2]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+
+ \option[]{*}
+
+ You can disable the special colouring of letter tiles in a
+ \keyword{wordle} puzzle by adding an asterisk,~\option{*}, as a
+ \textit{word}, into the puzzle.
+
+ \begin{example}
+ \begin{wordle}{ANVIL}
+ CRANE
+ NATAL
+ * % disable wordle colouring
+ ANNUL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Case sensitivity}
+ \index{case~sensitive}
+ \index{case~sensitive!lower case}
+ \index{case~sensitive!natural case}
+ \index{case~sensitive!upper case}
+
+ By default, the letters are printed in upper and lower case, exactly
+ as typed, and the letter comparisons are not case sensitive.
+
+ \option[false]{case~sensitive}
+
+ By default the \keyword{wordle} puzzles are not case sensitive, but
+ you can make them case sensitive using this option. Note that
+ \keyword{case sensitive} is the same as \keyword{case sensitive=true}
+ (and the default option is the same as
+ \keyword{case sensitive=false}).
+
+ \begin{example}
+ \begin{wordle}[case sensitive=false]{youth} % the default
+ North
+ South
+ Youth
+ \end{wordle}
+ \end{example}
+
+ Here is a case sensitive version of this puzzle.
+
+ \begin{example}
+ \begin{wordle}[case sensitive]{youth}
+ North
+ South
+ Youth
+ \end{wordle}
+ \end{example}
+
+ As this puzzle is case sensitive, the \keyword{Y} on the last line is
+ not marked as being correct because it does not match the \keyword{y}
+ in the solution.
+
+ \option[]{natural case} (default) \qquad
+ \option[]{lower case} \qquad
+ \option[]{upper case}
+
+ The \option{lower case} and \option{upper case} options force all
+ letters in the puzzle to be in lower or upper case, respectively.
+
+ \begin{example}
+ \begin{wordle}[lower case]{YOUTH}
+ North
+ South
+ Youth
+ \end{wordle}
+ \end{example}
+
+ \begin{example}
+ \begin{wordle}[upper case]{youth}
+ North
+ South
+ Youth
+ \end{wordle}
+ \end{example}
+
+ As these examples show, both of these options disable the case
+ sensitivity of the tests for colouring the \keyword{wordle} tiles;
+ that is, they set \option{case sensitive=false}. To balance the
+ \option{lower case} and \option{upper case} options, the
+ \option{natural case} option makes the \keyword{wordle} environment
+ restores the default behaviour, which respects the case of the letters
+ as typed into the environment. The \option{natural case} option does
+ not change the \option{case sensitive} setting.
+
+ \begin{example}
+ \begin{wordle}[natural case]{youth} % the default
+ North
+ South
+ youth
+ \end{wordle}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Adding \ctan{TikZ} code}
+
+ The \keyword{wordle} environment is a fancy wrapper around a
+ \keyword{tikzpicture} environment, with some code under the hood that
+ automatically colours the letter tiles according to how well they
+ match the solution. The options in this section describe how to access
+ the underlying \ctan{TikZ} layer.
+
+ \option[]{tikz}[TikZ commands]
+
+ The \option{tikz} option passes \ctan{TikZ} keys to the underlying
+ \keyword{tikzpicture} environment. The \option{tikz} option is almost
+ the same as using a \keyword{\tikzset{...}} command before the
+ \keyword{wordle} environment except that it is applied to the
+ \keyword{tikpicture} environment, which contains the \keyword{wordle}
+ puzzle, such that the \option{tikz} keys are applied \textit{after}
+ all of options above and \textit{before} \option{tile style} is
+ applied.
+
+ \begin{example}
+ % \usetikzlibrary{backgrounds}
+ \begin{wordle}[
+ tikz={framed,
+ background rectangle/.style={
+ double,ultra thick, draw=SteelBlue
+ }
+ }]{youth}
+ North South youth
+ \end{wordle}
+ \end{example}
+
+ As this example indicates, it is advisable to enclose complicated
+ \ctan{TikZ} settings inside braces.
+
+ \option[W]{name}
+
+ All of the tiles in a \keyword{wordle} puzzle are given node names of
+ the form $\langle$\textsf{name}$\rangle$-$\mathsf{r}$-$\mathsf{c}$,
+ for the tile in row~$\mathsf{r}$ and column~$\mathsf{c}$. By default,
+ the prefix \textsf{name} is \texttt{W}. Within reason, the
+ \option{name} prefix can be changed to anything you like using the
+ \option{name} option.
+
+ One way to use the named nodes for the letter tiles is with
+ \ctan{TikZ} \texttt{overlay} and \texttt{remember picture} keys:
+
+ \begin{example}
+ \begin{wordle}[tikz={remember picture}]{CRAZE}
+ TRACE
+ CREAM
+ CRAZE
+ \end{wordle}
+ \end{example}
+
+ This makes it possible, for example, to draw arrows to tiles in a
+ \keyword{wordle} puzzle:
+
+ \begin{example}
+ \tikz[remember picture]\draw[overlay, very thick, opacity=0.5,->,red](0,0)node{No M!} to [out=90, in=180](W-2-5);
+ \end{example}
+
+ A second use of the tile node names is in conjunction with \ctan{TikZ}
+ commands that can be added to a \keyword{wordle} puzzle using the
+ second optional argument to the environment. As with the \option{tikz}
+ option, it is advisable to enclose complicated \ctan{TikZ} commands
+ inside braces.
+
+ \begin{example}
+ \begin{wordle}[name=M,
+ tikz={arr/.style={Red,ultra thick,->}}
+ ]{MACAW}
+ [{
+ \draw[arr](M-1-3.south)--(M-3-2.north)--(M-4-2.north);
+ \draw[arr](M-1-1.south)--(M-3-5)--(M-4-3.north east);
+ }]
+ CRANE HOTLY BASIC MACAW
+ \end{wordle}
+ \end{example}
+
+ In practice, we are not convinced that anyone will find a real use for this!
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{The package code}
+
+ The \keyword{wordle} package is a \LaTeX3 package. There are many
+ comments in the code explaining how the code works. The automatic
+ colouring of the letter tiles is a fun exercise in \LaTeX3
+ programming, which was motivated by a
+ \href{https://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex/660056#660056}{tex.stackexchange.com} post.
+
+ Bug reports and feature requests can be made on \href{https://github.com/AndrewMathas/Wordle}{github}.
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \printindex
+
+\end{document}
diff --git a/graphics/pgf/contrib/wordle/wordle-doc-fr.pdf b/graphics/pgf/contrib/wordle/wordle-doc-fr.pdf
new file mode 100644
index 0000000000..09d306b0f3
--- /dev/null
+++ b/graphics/pgf/contrib/wordle/wordle-doc-fr.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/wordle/wordle-doc-fr.tex b/graphics/pgf/contrib/wordle/wordle-doc-fr.tex
new file mode 100644
index 0000000000..039bc7a158
--- /dev/null
+++ b/graphics/pgf/contrib/wordle/wordle-doc-fr.tex
@@ -0,0 +1,767 @@
+% !TeX TS-program = pdflatex
+
+\documentclass[svgnames]{report}
+\usepackage[utf8]{inputenc}
+\usepackage{wordle}
+\usepackage{manfnt}
+\usepackage{enumitem}
+\setlist[description]{font=\sffamily\bfseries\color{ForestGreen},labelwidth=\textwidth}
+\usepackage{booktabs}
+\usepackage[a4paper,margin=18mm]{geometry}
+\synctex=1
+\parindent=0pt
+\parskip=2mm
+
+\usepackage{cmap} % fix search and cut-and-paste in Acrobat
+\setcounter{secnumdepth}{0}
+
+\usepackage{listings}\lstset{language=[LaTeX]TeX,framerule=2pt}
+\lstset{language=[LaTeX]TeX,
+ texcsstyle=*\bfseries\color{Peru},
+ backgroundcolor=\color{Ivory},
+ numbers=none,
+ breaklines=true,
+ keywordstyle=\color{Sienna},
+ commentstyle=\color{BurlyWood},
+ tabsize=2,
+ morekeywords={Wordle,wordle,GrilleSutom},
+ resetmargins=true,
+}
+% hyperref links to ctan
+\newcommand\ctan[1]{\href{https://www.ctan.org/pkg/#1}{\texttt{#1}}}
+
+\newcommand\Section[1]{\subsection{\textcolor{DarkGreen}{#1}}}
+
+\ExplSyntaxOn
+\NewDocumentCommand\option{ omo }{%
+ \IfNoValueTF{#1}{\textsf{#2}}
+ {%
+ \textbf{\textcolor{Crimson}{#2}}
+ \str_if_empty:nF {#1}{~(défaut~:~\textcolor{DarkRed}{#1})}%
+ \IfNoValueF{#3}{\hfill\textcolor{Gray}{[accepte~:~#3]}}%
+ }%
+ \index{#2}%
+}
+\ExplSyntaxOff
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage{imakeidx}
+\indexsetup{level=\section*, toclevel=section, noclearpage}
+\makeindex[intoc,columns=3]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage[skins,listings]{tcolorbox}
+\usetikzlibrary{backgrounds, shapes.geometric} % for tikz={framed,...}
+
+\DeclareTotalTCBox\keyword{ O{} v }{
+ fontupper=\sffamily,
+ nobeforeafter,
+ skin=tile,
+ verbatim,
+ on line,
+ tcbox raise base,
+ top=0pt,bottom=0pt,left=0mm,right=0mm,
+ colback=OldLace,
+ colupper=ForestGreen,
+ #1}
+{#2}
+
+\lstdefinestyle{tikz}{style=tcblatex,
+ classoffset=0,
+ texcsstyle=*\color{DarkGoldenrod},%
+ deletetexcs={begin, end},
+ moretexcs={,%
+ node,
+ draw,
+ true,
+ false
+ },%
+ classoffset=1,
+ keywordstyle=\color{ForestGreen},%
+ morekeywords={wordle,GrilleSutom},
+ classoffset=2,
+ keywordstyle=\color{Crimson},%
+ morekeywords={
+ absent,
+ Strict,
+ Taille,
+ Lignes,
+ Epaisseur,
+ align,
+ border,
+ borders,
+ Bords,
+ Cadres,
+ Style,
+ Formes,
+ Separation,
+ case,
+ Police,
+ Arrondi,
+ Echelle,
+ NonLettres,
+ color,
+ Couleurs,
+ CouleurBordures,
+ CouleurLettres,
+ bordure,
+ couleur,
+ colours,
+ correct,
+ vide,
+ font,
+ frame,
+ frames,
+ letters,
+ lower,
+ params,
+ name,
+ natural,
+ noalign,
+ noletters,
+ present,
+ rounded,
+ rows,
+ scale,
+ sensitive,
+ separation,
+ shape,
+ shapes,
+ size,
+ strict,
+ style,
+ style,
+ text,
+ thickness,
+ tikz,
+ tile,
+ upper,
+ },
+ classoffset=3,
+ keywordstyle=\color{DarkOrange},%
+ morekeywords={
+ hard,
+ standard,
+ sutom,
+ }
+}
+
+\DeclareTCBListing{example}{ !O{} }{%
+ skin=bicolor,
+ colframe=MediumSeaGreen,
+ colbacklower=OldLace,
+ colback=LawnGreen!20,
+ lefthand width=50mm,
+ listing style=tikz,
+ sidebyside,
+ sidebyside align=center,
+ sidebyside gap=4mm,
+ text and listing,
+ text outside listing,
+ boxsep = 0pt,
+ #1
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\makeatletter
+\author{Andrew Mathas \&\ Cédric Pierquet}
+\usepackage{tikz}
+\usetikzlibrary{shadows.blur}
+\tikzset{shadowed/.style={blur shadow={shadow blur steps=5},
+ bottom color=ForestGreen!30,
+ draw=MediumSeaGreen!70,
+ shade,
+ font=\normalfont\Huge\bfseries\scshape,
+ rounded corners=8pt,
+ top color=SeaGreen,
+ },
+ boxes/.style={draw=SeaGreen,
+ fill=Cornsilk,
+ font=\sffamily\small,
+ inner sep=5pt,
+ rectangle,
+ rounded corners=8pt,
+ text=DarkGreen,
+ }
+}
+\newcommand\Wordle{%
+ \begin{tikzpicture}[remember picture,overlay]
+ \node[yshift=-3cm] at (current page.north west)
+ {\begin{tikzpicture}[remember picture, overlay]
+ \draw[shadowed](30mm,0) rectangle node[white]{wordle} (\paperwidth-30mm,16mm);
+ \node[anchor=west,boxes] at (4cm,0cm) {\@author};
+ \node[anchor=east,boxes] at (\paperwidth-4cm,0) {Version \wordle@version};
+ \end{tikzpicture}
+ };
+ \end{tikzpicture}
+ \vspace*{20mm}
+}
+
+\def\@oddfoot{\textsc{Wordle} --- \wordle@version~(version~du~\wordle@release)\hfill\thepage}
+
+\usepackage[colorlinks=true,linkcolor=blue,urlcolor=MediumBlue]{hyperref}
+\hypersetup{
+ pdfcreator={ Generated by pdfLaTeX },
+ pdfinfo={
+ Author ={ Andrew Mathas et Cédric Pierquet },
+ Keywords={ wordle },
+ License ={ LaTeX Project Public License v1.3c or later },
+ Subject ={ LaTeXing Wordle puzzles },
+ Title ={ Wordle - \wordle@version }
+ },
+}
+\makeatother
+
+\begin{document}
+
+ \Wordle
+
+ Ce package fournit un moyen \textit{stupidement} riche en fonctionnalités de créer des puzzles \keyword{Wordle} en \LaTeX, que \href{https://en.wikipedia.org/wiki/Wordle}{Wikipedia} décrit comme
+ comme un jeu de lettres en ligne extrêmement populaire, créé et développé par l'ingénieur logiciel gallois Josh Wardle. Ce paquet
+ est une version améliorée d'une des solutions à une question posée par \textcolor{FireBrick}{valerio\_new} sur \href{https://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex/660056#660056}{tex.stackexchange.com}.
+
+ Ce paquet fournit l'environnement \keyword{GrilleSutom}, qui utilise la syntaxe :
+
+ \begin{tcblisting}{
+ listing only,
+ skin=bicolor,
+ colframe=MediumSeaGreen,
+ colbacklower=OldLace,
+ colback=LawnGreen!20,
+ listing style=tikz,
+ boxsep = 0pt,
+ }
+ % \usepackage{wordle}
+ \begin{GrilleSutom}[params sutom]{solution}[commandes tikz optionnelles]
+ essai1 essai2 ...
+ \end{GrilleSutom}
+ \end{tcblisting}
+ \index{environnement!GrilleSutom}
+ \index{GrilleSutom}
+ \index{sutom}
+
+ et l'environnement \keyword{wordle}, pour la version anglaise du jeu :
+
+ \begin{tcblisting}{
+ listing only,
+ skin=bicolor,
+ colframe=MediumSeaGreen,
+ colbacklower=OldLace,
+ colback=LawnGreen!20,
+ listing style=tikz,
+ boxsep = 0pt,
+ }
+ % \usepackage{wordle}
+ \begin{wordle}[params wordle]{solution}[commandes tikz optionnelles]
+ essai1 essai2 ...
+ \end{wordle}
+ \end{tcblisting}
+ \index{environnement!wordle}
+ \index{wordle}
+
+ Les mots du puzzle peuvent être saisis sur une seule ligne ou sur des lignes séparées. Voici quelques exemples :
+
+ \begin{example}
+ %Version fr du wordle (sutom)
+ \begin{GrilleSutom}{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ % Version en du sutom (wordle)
+ \begin{wordle}{SUTOM}
+ SAUCE
+ SAUTS
+ SUTOM
+ \end{wordle}
+ \end{example}
+
+ Comme pour les puzzles en ligne, l'environnement \keyword{GrilleSutom}
+ colore automatiquement les lettres en
+ \keyword[colback=WordleSutomCorrect,colupper=White]{rouge}
+ lorsque la lettre se trouve dans la même position que la solution, et en
+ \keyword[colback=WordlePresent,colupper=White]{or} lorsque la lettre est dans la solution mais qu'elle n'est pas bien placée.
+ De même, \keyword{GrilleSutom} colore les lettres correctes en
+ \keyword[colback=WordleCorrect,colupper=White]{vert}
+ et les lettres actuelles en
+ \keyword[colback=WordleCorrect,colupper=White]{or}.
+ Comme décrites ci-dessous, ces couleurs peuvent être modifiées en fonction de vos goûts.
+
+ Le nombre de lettres du puzzle est déterminé par la solution, et n'est limité que par la largeur de la page.
+
+ \begin{example}
+ \begin{GrilleSutom}[Lignes=4]{orange}
+ normal
+ ordres
+ orange
+ \end{GrilleSutom}
+ \end{example}
+
+ Les lettres du puzzle peuvent être saisies en majuscules, en minuscules ou en mélange de majuscules et de minuscules. Par défaut, la casse des lettres est ignorée lors de la détermination des couleurs des cases de lettres.
+
+ Comme décrit ci-dessous, les environnements \keyword{wordle} et \keyword{GrilleSutom} acceptent une liste d'options différentes qui modifient les couleurs, les polices et les formes de la tuile. De plus, vous pouvez modifier la sensibilité à la casse des environnements, ajouter des lignes supplémentaires au puzzle, désactiver la mise en forme spéciale des \textit{cases de lettres}. Ces options sont données sous la forme d'une liste séparée par des virgules de paires \texttt{clé-valeur}. Elles peuvent être définies localement, en utilisant l'argument optionnel de l'environnement \keyword|wordle|, ou globalement (plus précisément, dans le groupe \LaTeX\ actuel) en utilisant la commande \keyword{\ParamsSutom} \index{\textbackslash ParamsSutom}, ou comme options globales du package, via \keyword{\usepackage[options]{wordle}}. L'ordre des options n'a pas d'importance, sauf que les options ultérieures ont priorité sur les options précédentes, à l'exception des clés \option{tikz} et \option{tile style} qui sont toujours appliquées en dernier.
+
+ Les puzzles \keyword{wordle} sont dessinés à l'aide de \ctan{TikZ}, chaque lettre du puzzle étant placée à l'intérieur d'un nœud \ctan{TikZ}. De nombreuses options contrôlent les paramètres de ces nœuds. Les descriptions des options ci-dessous sont regroupées en fonction de leur fonction.
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Styles Wordle}
+
+ La clé \option{Style} peut être utilisée pour modifier de nombreuses caractéristiques des cases dans un puzzle \keyword{wordle}, y compris leurs couleurs, les polices et ainsi de suite. Les paramètres les plus courants peuvent être définis à l'aide du mot-clé \option{style}. \textit{Le style doit toujours être défini en premier car, sinon, les paramètres de style peuvent remplacer les paramètres précédents.}
+
+ Les styles suivants sont pris en charge :
+
+ \textcolor{DarkOrange}{sutom}
+ \index{Style!sutom}
+ \index{sutom}
+
+ \begin{example}
+ \begin{GrilleSutom}[Style=sutom]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ En plus de définir les couleurs des cases, les cadres et les formes, le style \textsf{sutom} définit également la taille des cases à 8 mm. Le style \textsf{sutom} est le style par défaut pour l'environnement \keyword{GrilleSutom}.
+
+ \textcolor{DarkOrange}{standard}
+ \index{style!standard}
+
+ \begin{example}
+ \begin{GrilleSutom}[Style=standard]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ Le style \textcolor{DarkOrange}{standard} est le style par défaut pour l'environnement \keyword{wordle}.
+
+ \textcolor{DarkOrange}{hard}
+ \index{style!hard}
+
+ \begin{example}
+ \begin{GrilleSutom}[Style=hard]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Options pour les styles individuels des cases de lettres}
+
+ Il existe quatre types de cases de lettres dans \keyword{wordle} :
+ \option{absent}, \option{present}, \option{correct} et
+ \option{vide}, correspondant respectivement aux lettres qui ne sont pas dans la solution,
+ aux lettres mal placées, aux lettres correctement placées et aux cases vides. Les options de cette section peuvent être utilisées pour
+ définir les couleurs du texte, des cases et des bordures, les formes et les cadres de ces cases.
+
+ Les cases de lettres dans un environnement \keyword{wordle} sont composées à l'intérieur
+ d'un \keyword{\node} \ctan{TikZ}. Les options ci-dessous contrôlent les
+ différents paramètres de style de ces nœuds.
+
+ \option[--]{Couleurs}[liste de couleurs valides séparées par des virgules]
+
+ L'option \option{Couleurs} est un raccourci pour spécifier les
+ couleurs des cases \option{absent}, \option{present}, \option{correct} et
+ \option{vide}, dans cet ordre. Les couleurs suivantes peuvent être omises, mais
+ les couleurs doivent être données dans cet ordre, de gauche à droite.
+ Si une seule couleur est donnée, cette couleur est appliquée à toutes les cases.
+
+ \begin{example}
+ \begin{GrilleSutom}[Couleurs={LightGray,Orange,Teal}]{cellar}
+ pounds
+ taylor
+ cellar
+ \end{GrilleSutom}
+ \end{example}
+
+ Les couleurs peuvent également être définies individuellement à l'aide de \option{couleur absent}, \option{couleur present}, \option{couleur correct} et \option{couleur vide}.
+
+ \begin{example}
+ \begin{GrilleSutom}[couleur absent=DarkGray,couleur present=Salmon,
+ couleur correct=SeaGreen]{cellar}
+ pounds
+ taylor
+ cellar
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[white]{CouleurBordures}[liste de couleurs valides séparées par des virgules]
+
+ de manière similaire à l'option \option{Couleurs}, il s'agit d'un raccourci pour le paramétrage des couleurs des bordures des cases \option{absent}, \option{present},
+ \option{correct} et \option{vide}, dans cet ordre.
+
+ Si une seule couleur est donnée, elle est appliquée à toutes les cases.
+
+ \begin{example}
+ \begin{GrilleSutom}[CouleurBordures={red,orange,blue}]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ Les bordures pour les cases individuelles peuvent être paramétrer via
+ \option{bordure absent}, \option{bordure present}, \option{bordure correct} et \option{bordure vide}.
+
+ \option[false]{Cadres}[liste de booléens true/false séparées par des virgules]
+
+ Il s'agit d'un raccourci pour ajouter un cadre autour des cases \option{absent}, \option{present}, \option{correct} et \option{vide}, dans cet ordre, avec la même couleur que \option{absent}. C'est utile uniquement pour les cases non carrée.
+
+ \begin{example}
+ \begin{GrilleSutom}[Cadres={false,true,true},Formes=circle]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ Les cadres pour les cases individuelles peuvent être paramétrer via \option{cadre absent}, \option{cadre present},
+ \option{cadre correct} and \option{cadre vide}.
+
+ \option[rectangle]{Formes}[liste de formes TikZ séparées par des virgules]
+
+ De même que pour l'option \option{Couleurs}, c'est un raccourci pour paramétrer les formes des cases \option{absent}, \option{present},
+ \option{correct} et \option{vide}, dans cet ordre.
+
+ \begin{example}
+ \begin{GrilleSutom}[Formes={circle, rectangle, circle}]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ Les formes individuelles peuvent être paramétrer via \option{forme absent}, \option{forme present},
+ \option{forme correct} et \option{forme vide}.
+
+ Les formes proposés par le package \ctan{TikZ}
+ \texttt{shapes.geometric}, incluant \texttt{diamond},
+ \texttt{ellipse}, \texttt{trapezium} et \texttt{star} (voir section~71.2 du manuel \ctan{TikZ}).
+
+ \begin{example}
+ % \usepackage{shapes.geometric}
+ \begin{GrilleSutom}[Formes={diamond,ellipse,star}]{LADLE}
+ FLAIL
+ LAPEL
+ *
+ LADLE
+ LOVER
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[white]{CouleurLettres}[liste de couleurs valides séparées par des virgules]
+
+ Il s'agir d'un raccourci pour paramétrer la couleur des lettres des cases \option{absent}, \option{present}, \option{correct} et \option{vide}, dans cet ordre.
+
+ \begin{example}
+ \begin{GrilleSutom}[CouleurLettres={red,orange,blue}]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ Les cases individuelles peuvent être paramétrer via \option{coultxt absent}, \option{coultxt present}, \option{coultxt correct} et \option{coultxt vide}.
+
+
+ \Section{Caractéristiques communes des cases}
+
+ Les options suivantes s'appliquent à toutes les cases.
+
+ \option[]{nonalign} (default) \qquad
+ \option[]{align}
+
+ Cette option s'occupe de l'alignement vertical des lettres. C'est utile essentiellement lors de l'utilisation de minuscules.
+
+ \begin{example}
+ \begin{GrilleSutom}[align]{agony}
+ groan
+ angry
+ agony
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}{agony} % nonalign par defaut
+ groan
+ angry
+ agony
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[\textbackslash Large\textbackslash bfseries\textbackslash sffamily]{Police}
+ [Police \LaTeX]
+
+ Cela permet de paramétrer la police de toutes les lettres. Toute commande valide est acceptée.
+
+ \begin{example}
+ \begin{GrilleSutom}[Police=\large\ttfamily]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[1mm]{Arrondi}[une longueur]
+
+ Cela permet de paramétrer le paramètres \texttt{rounded corners} (de TikZ) pour les cases \keyword{wordle}.
+
+ \begin{example}
+ \begin{GrilleSutom}[Arrondi=2.5mm]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[0.5mm]{Separation}[une longueur]
+
+ Cela permet de paramétrer la séparation entre les cases du \keyword{wordle}.
+
+ \begin{example}
+ \begin{GrilleSutom}[Separation=2mm,CouleurBordures=black]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[1]{Echelle}[un nombre]
+
+ L'option \option{Echelle} applique un facteur à l'environnement \keyword{wordle}.
+ Cette option modifie les dimensions définies par les options \option{Arrondi},
+ \option{Separation}, \option{Taille} et \option{Epaisseur}. Si vous changez l'échelle, vous voudrez également changer la police de caractères via \option{Police} :
+
+ \begin{example}
+ \begin{GrilleSutom}[Echelle=1.5,Police=\huge\bfseries]{SIZE}
+ HELP
+ WISE
+ SIZE
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[8mm]{Taille}[une longueur]
+
+ L'option \option{Taille} définit la taille des cases. Contrairement à l'option \option{Echelle}, \option{Taille} change uniquement la dimension des cases.
+
+ \begin{example}
+ \begin{GrilleSutom}[Taille=10mm,Police=\huge\bfseries]{REPU}
+ ABRI ROUE * REPU
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[0.25mm]{Epaisseur}[une longueur]•
+
+ Cela permet de paramétrer la taille des bordures des cases. Par défaut la couleur est blanche, donc pour illustrer cette option elle sera paramétrer en rouge.
+
+ \begin{example}
+ \begin{GrilleSutom}[Epaisseur=0.75mm,CouleurBordures=red]{LADLE}
+ FLAIL
+ LAPEL
+ LADLE
+ \end{GrilleSutom}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Lignes et colonnes supplémentaires}
+
+ Par défaut, le nombre de lignes et de colonnes de la grille est fixée par les mots donnés.
+
+ \option[]{Lettres} (défaut)\qquad
+ \option[]{NonLettres}
+
+ Par dafut, les lettres sont affichées, mais l'option \option{NonLettres} peuvent être cachées.
+
+ \begin{example}
+ \begin{GrilleSutom}{CRAZE} % the default
+ TRACE
+ CREAM
+ CRAZE
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}[NonLettres]{CRAZE}
+ TRACE
+ CREAM
+ CRAZE
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[false]{Strict}[true/false/--]
+
+ Par défaut, l'environnement ne vérifie pas si tous les mots sont la même taille, donc les lettres \textit{en trop} n'ont pas de style particulier.
+
+ \begin{example}
+ \begin{GrilleSutom}[Strict=false]{CRAZE} % par defaut
+ GRAIL
+ CRAMPS
+ CRAM
+ CRABS
+ \end{GrilleSutom}
+ \end{example}
+
+ L'option booléenne \option{Strict} force un style particulier des lettre \textit{en trop}.
+
+ \begin{example}
+ \begin{GrilleSutom}[Strict]{CRAZE}
+ GRAIL
+ CRAMPS
+ CRAM
+ CRABS
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[--]{Lignes}
+
+ Par défaut, l'environnement \keyword{wordle} affiche le nombre de lignes en adéquation avec le nombre de mots donnés. L'option \option{Lignes} permet de modifier le nombre de lignes (évenuellement vides).
+
+ \begin{example}
+ \begin{GrilleSutom}[Lignes=4]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}[Lignes=2]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[]{*}
+
+ Le style des case peut être annulé en ajoutant un astérisque,~\option{*}, en tant que mot.
+
+ \begin{example}
+ \begin{GrilleSutom}{ANVIL}
+ CRANE
+ NATAL
+ * % annule la mise en forme
+ ANNUL
+ ANVIL
+ \end{GrilleSutom}
+ \end{example}
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Sensibilité à la casse}
+ \index{case~sensitive}
+ \index{case~sensitive!lower case}
+ \index{case~sensitive!natural case}
+ \index{case~sensitive!upper case}
+
+ Par défaut, les lettres peuvent être écrites en majuscule ou en minuscule, comme saisies par l'utilisateur.
+
+ L'option (voir doc en anglais) \option{case~sensitive} permet de spécifier un paramétrage de la casse.
+
+ \begin{example}
+ \begin{GrilleSutom}[case sensitive=false]{youth} % par defaut
+ North
+ South
+ Youth
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}[case sensitive]{youth}
+ North
+ South
+ Youth
+ \end{GrilleSutom}
+ \end{example}
+
+ Les options \textit{fines} \option{natural case} (défaut), \option{lower case}et \option{upper case} permettent de travailler plus finement sur la casse des lettres correctes et/ou mal placées.
+
+ \begin{example}
+ \begin{GrilleSutom}[lower case]{YOUTH}
+ North
+ South
+ Youth
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}[upper case]{youth}
+ North
+ South
+ Youth
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}[natural case]{youth} % par defaut
+ North
+ South
+ youth
+ \end{GrilleSutom}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Style \ctan{TikZ} complémentaire}
+
+ \option[]{tikz}[commandes TikZ]
+
+ \begin{example}
+ % \usetikzlibrary{backgrounds}
+ \begin{GrilleSutom}[
+ tikz={framed,
+ background rectangle/.style={
+ double,ultra thick, draw=SteelBlue
+ }
+ }]{youth}
+ North South youth
+ \end{GrilleSutom}
+ \end{example}
+
+ \pagebreak
+
+ \option[W]{Nom}
+
+ \begin{example}
+ \begin{GrilleSutom}[tikz={remember picture}]{CRAZE}
+ TRACE
+ CREAM
+ CRAZE
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \tikz[remember picture]\draw[overlay, very thick, opacity=0.5,->,red](0,0)node{Pas de M !!!} to [out=90, in=180](W-2-5);
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}[name=M,
+ tikz={arr/.style={red,ultra thick,->}}
+ ]{MACAW}
+ [{
+ \draw[arr](M-1-3.south)--(M-3-2.north)--(M-4-2.north);
+ \draw[arr](M-1-1.south)--(M-3-5)--(M-4-3.north east);
+ }]
+ CRANE HOTLY BASIC MACAW
+ \end{GrilleSutom}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Le code}
+
+ Le package \keyword{wordle} est écrit en \LaTeX3. Beaucoup de commentaires permettent d'expliciter le fonctionnement du code. La coloration automatique des cases est un exercice amusant en \LaTeX3, motivépar un message issu de
+ \href{https://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex/660056#660056}{tex.stackexchange.com}.
+
+ Le dépôt \href{https://github.com/AndrewMathas/Wordle}{github.com/AndrewMathas/Wordle} est disponible pour signaler tout bug.
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \printindex
+
+\end{document}
diff --git a/graphics/pgf/contrib/wordle/wordle.sty b/graphics/pgf/contrib/wordle/wordle.sty
new file mode 100644
index 0000000000..a463f22837
--- /dev/null
+++ b/graphics/pgf/contrib/wordle/wordle.sty
@@ -0,0 +1,670 @@
+% ---------------------------------------------------------------
+% wordle --- A latex package for typesetting wordle puzzles
+%
+% E-mail: andrew.mathas@gmail.com and cpierquet@outlook.fr
+% Released under the LaTeX Project Public License v1.3c or later
+% See http://www.latex-project.org/lppl.txt
+% ----------------------------------------------------------------
+
+\NeedsTeXFormat{LaTeX2e}
+
+% Package version
+\def\wordle@version{0.3.0}
+\def\wordle@release{2024-08-18}
+
+\providecommand\DeclareRelease[3]{}
+\providecommand\DeclareCurrentRelease[2]{}
+\DeclareRelease{\wordle@version}{\wordle@release}{wordle.sty}
+\DeclareCurrentRelease{}{\wordle@release}
+
+\ProvidesExplPackage{wordle} {\wordle@release} {\wordle@version}
+ {A latex package for typesetting wordle puzzles}
+
+% ----------------------------------------------------------------
+% Required packages
+%\RequirePackage{xcolor}
+\RequirePackage{tikz}
+
+% ----------------------------------------------------------------
+% predefined tile colours
+
+% from https://www.nytimes.com/games/wordle
+\definecolor{WordleAbsent} {HTML} {797D7F}
+\definecolor{WordlePresent} {HTML} {F7DA21}
+\definecolor{WordleCorrect} {HTML} {6AAB64}
+\definecolor{WordleEmpty} {HTML} {F5F5DC}
+
+\definecolor{WordleHardPresent} {HTML} {95BEFA}
+\definecolor{WordleHardCorrect} {HTML} {FB9B00}
+
+% from https://sutom.nocle.fr/#
+\definecolor{WordleSutomAbsent} {HTML} {0077B7}
+\definecolor{WordleSutomPresent} {HTML} {FFBB00}
+\definecolor{WordleSutomCorrect} {HTML} {EB2152}
+
+% ----------------------------------------------------------------
+% package variables
+
+\bool_new:N \l__wordle_case_sensitive_bool % case sensitive mode (false by default)
+\bool_new:N \l__wordle_strict_bool % strict mode (false by default)
+
+\dim_new:N \l__wordle_grid_dim
+\dim_new:N \l__wordle_rounded_dim
+\dim_new:N \l__wordle_sep_dim
+\dim_new:N \l__wordle_size_dim
+\dim_new:N \l__wordle_thickness_dim
+
+\int_new:N \l__wordle_rows_int
+
+\fp_new:N \l__wordle_scale_fp
+
+\tl_new:N \l__wordle_align_tl
+\tl_new:N \l__wordle_depth_tl
+\tl_new:N \l__wordle_font_tl
+\tl_new:N \l__wordle_name_tl
+\tl_new:N \l__wordle_style_tl
+\tl_new:N \l__wordle_tikz_tl
+\tl_new:N \l__wordle_tile_style_tl
+
+\tl_new:N \l__wordle_present_border_tl
+\tl_new:N \l__wordle_present_colour_tl
+\tl_new:N \l__wordle_present_frame_tl
+\tl_new:N \l__wordle_present_shape_tl
+\tl_new:N \l__wordle_present_text_tl
+
+\tl_new:N \l__wordle_correct_border_tl
+\tl_new:N \l__wordle_correct_colour_tl
+\tl_new:N \l__wordle_correct_frame_tl
+\tl_new:N \l__wordle_correct_shape_tl
+\tl_new:N \l__wordle_correct_text_tl
+
+\tl_new:N \l__wordle_empty_border_tl
+\tl_new:N \l__wordle_empty_colour_tl
+\tl_new:N \l__wordle_empty_frame_tl
+\tl_new:N \l__wordle_empty_shape_tl
+\tl_new:N \l__wordle_empty_text_tl
+
+\tl_new:N \l__wordle_absent_border_tl
+\tl_new:N \l__wordle_absent_colour_tl
+\tl_new:N \l__wordle_absent_frame_tl
+\tl_new:N \l__wordle_absent_shape_tl
+\tl_new:N \l__wordle_absent_text_tl
+
+
+% ----------------------------------------------------------------
+% Assign up to four style attributes from comma separated list to absent,
+% present, correct, empty, respectively. If there is only one entry in
+% the list then everything is set equal to that entry
+\cs_new_nopar:Npn \__wordle_set_style:nn #1#2
+{
+ \seq_set_split:Nnn \l_tmpa_seq {,} {#2}
+ \int_compare:nNnTF {\seq_count:N \l_tmpa_seq} = {1}
+ {
+ \tl_set:co {l__wordle_absent_#1_tl} {#2}
+ \tl_set:co {l__wordle_present_#1_tl} {#2}
+ \tl_set:co {l__wordle_correct_#1_tl} {#2}
+ \tl_set:co {l__wordle_empty_#1_tl} {#2}
+ }
+ {
+ \seq_pop_left:NNT \l_tmpa_seq \l_tmpa_tl { \tl_set:co {l__wordle_absent_#1_tl} {\l_tmpa_tl} }
+ \seq_pop_left:NNT \l_tmpa_seq \l_tmpa_tl { \tl_set:co {l__wordle_present_#1_tl} {\l_tmpa_tl} }
+ \seq_pop_left:NNT \l_tmpa_seq \l_tmpa_tl { \tl_set:co {l__wordle_correct_#1_tl} {\l_tmpa_tl} }
+ \seq_pop_left:NNT \l_tmpa_seq \l_tmpa_tl { \tl_set:co {l__wordle_empty_#1_tl} {\l_tmpa_tl} }
+ }
+}
+
+% apply the wordle styles
+\cs_new_nopar:Npn \__wordle_apply_style:n #1 {
+ \str_case:enF { #1 }
+ {
+ {hard}
+ {
+ \__wordle_set_style:nn {border} {white}
+ \__wordle_set_style:nn {colour} {WordleAbsent,WordleHardPresent,WordleHardCorrect,WordleEmpty}
+ \__wordle_set_style:nn {frame} {false}
+ \__wordle_set_style:nn {shape} {rectangle}
+ \__wordle_set_style:nn {text} {white,white,white,black}
+ }
+
+ {alt}
+ { % alt appears in the English version of Cedric's manual for sutom
+ \__wordle_set_style:nn {border} {white}
+ \__wordle_set_style:nn {colour} {WordleSutomAbsent,WordleSutomPresent,WordleSutomCorrect,WordleEmpty}
+ \__wordle_set_style:nn {frame} {false,true,false,false}
+ \__wordle_set_style:nn {shape} {rectangle,circle,rectangle,circle}
+ \__wordle_set_style:nn {text} {white,white,white,black}
+ \tl_set:Nn \l_wordle_font_tl {\LARGE\bfseries\sffamily}
+
+ }
+
+ {sutom}
+ {
+ \__wordle_set_style:nn {border} {white}
+ \__wordle_set_style:nn {colour} {WordleSutomAbsent,WordleSutomPresent,WordleSutomCorrect,WordleEmpty}
+ \__wordle_set_style:nn {frame} {false,true,false,false}
+ \__wordle_set_style:nn {shape} {rectangle,circle,rectangle,circle}
+ \__wordle_set_style:nn {text} {white,white,white,black}
+ \tl_set:Nn \l_wordle_font_tl {\LARGE\bfseries\sffamily}
+ }
+ }
+ {
+ % default style
+ \__wordle_set_style:nn {border} {white}
+ \__wordle_set_style:nn {colour} {WordleAbsent,WordlePresent,WordleCorrect,WordleEmpty}
+ \__wordle_set_style:nn {frame} {false}
+ \__wordle_set_style:nn {shape} {rectangle}
+ \__wordle_set_style:nn {text} {white,white,white,black}
+ }
+}
+
+% rescale dimensions
+\cs_new_nopar:Npn \__wordle_rescale:n #1
+{
+ \fp_set:Nn \l__wordle_scale_fp {#1}
+ \dim_set:Nn \l__wordle_rounded_dim { \fp_eval:n {#1*\dim_to_decimal_in_mm:n {\l__wordle_rounded_dim }}mm }
+ \dim_set:Nn \l__wordle_sep_dim { \fp_eval:n {#1*\dim_to_decimal_in_mm:n {\l__wordle_sep_dim }}mm }
+ \dim_set:Nn \l__wordle_size_dim { \fp_eval:n {#1*\dim_to_decimal_in_mm:n {\l__wordle_size_dim }}mm }
+ \dim_set:Nn \l__wordle_thickness_dim { \fp_eval:n {#1*\dim_to_decimal_in_mm:n {\l__wordle_thickness_dim}}mm }
+}
+
+
+% ----------------------------------------------------------------
+% just in case we're running an old version of latex
+\providecommand \IfFormatAtLeastTF { \@ifl@t@r \fmtversion }
+
+\IfFormatAtLeastTF { 2022-06-01 }
+ { \ProcessKeyOptions [ wordle ] }
+ {
+ \RequirePackage { l3keys2e }
+ \ProcessKeysOptions { wordle }
+ }
+
+% ----------------------------------------------------------------
+% Define keys for the package options and their defaults
+
+\keys_define:nn { wordle }
+{
+ % apply puzzle styles: sets colours of absent, present, correct and empty tiles
+ style .code:n = {
+ \seq_set_from_clist:Nn \l_tmpa_seq {#1}
+ \seq_map_inline:Nn \l_tmpa_seq { \__wordle_apply_style:n { \str_lowercase:n{##1}} }
+ },
+ Style .meta:n = { style = #1 },
+ style .initial:n = standard,
+
+ % specifying tile colours and shapes
+ borders .code:n = { \__wordle_set_style:nn {border} {#1} },
+ BorderColor .code:n = { \__wordle_set_style:nn {border} {#1} },
+ CouleurBordures.code:n = { \__wordle_set_style:nn {border} {#1} },
+
+ Couleurs .code:n = { \__wordle_set_style:nn {colour} {#1} },
+ colours .code:n = { \__wordle_set_style:nn {colour} {#1} },
+
+ frames .code:n = { \__wordle_set_style:nn {frame} {#1} },
+ Cadres .code:n = { \__wordle_set_style:nn {frame} {#1} },
+ frames .default:n = true,
+ shapes .code:n = { \__wordle_set_style:nn {shape} {#1} },
+ Formes .code:n = { \__wordle_set_style:nn {shape} {#1} },
+
+ % text colour
+ text .code:n = { \__wordle_set_style:nn {text} {#1} },
+ CouleurLettres .code:n = { \__wordle_set_style:nn {text} {#1} },
+
+ % align letters in puzzle
+ align .code:n = {
+ \tl_set:Nn \l__wordle_align_tl {\vphantom{azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN}}
+ \tl_set:Nn \l__wordle_depth_tl {text~depth=0pt}
+ },
+ noalign .code:n = {
+ \tl_set:Nn \l__wordle_align_tl {}
+ \tl_set:Nn \l__wordle_depth_tl {}
+ },
+ nonalign .meta:n = { noalign },
+ align .initial:n = {true},
+
+ absent .tl_set:N = \l__wordle_absent_colour_tl,
+ absent~color .tl_set:N = \l__wordle_absent_colour_tl,
+ couleur~absent .tl_set:N = \l__wordle_absent_colour_tl,
+ absent~colour .tl_set:N = \l__wordle_absent_colour_tl,
+ bordure~absent .tl_set:N = \l__wordle_absent_border_tl,
+ absent~border .tl_set:N = \l__wordle_absent_border_tl,
+ absent~frame .tl_set:N = \l__wordle_absent_frame_tl,
+ cadre~absent .tl_set:N = \l__wordle_absent_frame_tl,
+ absent~frame .default:n = true,
+ absent~shape .tl_set:N = \l__wordle_absent_shape_tl,
+ forme~absent .tl_set:N = \l__wordle_absent_shape_tl,
+ absent~text .tl_set:N = \l__wordle_absent_text_tl,
+ coultxt~absent .tl_set:N = \l__wordle_absent_text_tl,
+
+ correct .tl_set:N = \l__wordle_correct_colour_tl,
+ correct~color .tl_set:N = \l__wordle_correct_colour_tl,
+ correct~colour .tl_set:N = \l__wordle_correct_colour_tl,
+ couleur~correct.tl_set:N = \l__wordle_correct_colour_tl,
+ correct~border .tl_set:N = \l__wordle_correct_border_tl,
+ bordure~correct.tl_set:N = \l__wordle_correct_border_tl,
+ correct~frame .tl_set:N = \l__wordle_correct_frame_tl,
+ cadre~correct .tl_set:N = \l__wordle_correct_frame_tl,
+ correct~frame .default:n = true,
+ correct~shape .tl_set:N = \l__wordle_correct_shape_tl,
+ forme~correct .tl_set:N = \l__wordle_correct_shape_tl,
+ correct~text .tl_set:N = \l__wordle_correct_text_tl,
+ coultxt~correct.tl_set:N = \l__wordle_correct_text_tl,
+
+ empty .tl_set:N = \l__wordle_empty_colour_tl,
+ couleur~vide .tl_set:N = \l__wordle_empty_colour_tl,
+ empty~color .tl_set:N = \l__wordle_empty_colour_tl,
+ empty~colour .tl_set:N = \l__wordle_empty_colour_tl,
+ empty~border .tl_set:N = \l__wordle_empty_border_tl,
+ bordure~vide .tl_set:N = \l__wordle_empty_border_tl,
+ empty~frame .tl_set:N = \l__wordle_empty_frame_tl,
+ cadre~vide .tl_set:N = \l__wordle_empty_frame_tl,
+ empty~frame .default:n = true,
+ empty~shape .tl_set:N = \l__wordle_empty_shape_tl,
+ forme~vide .tl_set:N = \l__wordle_empty_shape_tl,
+ empty~text .tl_set:N = \l__wordle_empty_text_tl,
+ coultxt~vide. tl_set:N = \l__wordle_empty_text_tl,
+
+ present .tl_set:N = \l__wordle_present_colour_tl,
+ couleur~present.tl_set:N = \l__wordle_present_colour_tl,
+ present~color .tl_set:N = \l__wordle_present_colour_tl,
+ present~colour .tl_set:N = \l__wordle_present_colour_tl,
+ present~border .tl_set:N = \l__wordle_present_border_tl,
+ bordure~present.tl_set:N = \l__wordle_present_border_tl,
+ present~frame .tl_set:N = \l__wordle_present_frame_tl,
+ cadre~present .tl_set:N = \l__wordle_present_frame_tl,
+ present~frame .default:n = true,
+ present~shape .tl_set:N = \l__wordle_present_shape_tl,
+ forme~present .tl_set:N = \l__wordle_present_shape_tl,
+ present~text .tl_set:N = \l__wordle_present_text_tl,
+ coultxt~present.tl_set:N = \l__wordle_present_text_tl,
+
+ % text font
+ font .tl_set:N = \l__wordle_font_tl,
+ Fonte .tl_set:N = \l__wordle_font_tl,
+ Police .tl_set:N = \l__wordle_font_tl,
+ font .initial:n = \Large\bfseries\sffamily,
+
+ % tile size
+ size .dim_set:N = \l__wordle_size_dim,
+ Taille .dim_set:N = \l__wordle_size_dim,
+ size .initial:n = 8mm,
+
+ % thickness of tile border
+ thickness .dim_set:N = \l__wordle_thickness_dim,
+ Epaisseur .dim_set:N = \l__wordle_thickness_dim,
+ Thick .code:n = {\dim_set:Nn \l__wordle_thickness_dim {#1mm}},
+ thickness .initial:n = 0.25mm,
+
+ % rounded-corner = #
+ rounded .dim_set:N = \l__wordle_rounded_dim,
+ Arrondi .dim_set:N = \l__wordle_rounded_dim,
+ rounded .default:n = 4pt,
+ Rounded .code:n = {\dim_set:Nn \l__wordle_rounded_dim {#1mm}},
+ rounded .initial:n = 1mm,
+
+ % separation between tiles
+ separation .dim_set:N = \l__wordle_sep_dim,
+ Separation .dim_set:N = \l__wordle_sep_dim,
+ separation .initial:n = 0.5mm,
+
+ % rescale tiles
+ scale .code:n = { \__wordle_rescale:n {#1} },
+ Echelle .code:n = { \__wordle_rescale:n {#1} },
+ scale .initial:n = 1,
+ Unit .code:n = { \__wordle_rescale:n {#1} },
+ Unite .code:n = { \__wordle_rescale:n {#1} },
+
+ % letter case
+ case~sensitive .bool_set:N = \l__wordle_case_sensitive_bool,
+ case~sensitive .default:n = true,
+ case~sensitive .initial:n = false,
+
+ % letter visibility
+ letters .code:n = {\cs_set_eq:NN \__wordle_letter:n \__wordle_letter_natural:n},
+ Lettres .code:n = {\cs_set_eq:NN \__wordle_letter:n \__wordle_letter_natural:n},
+ noletters .code:n = {\cs_set_eq:NN \__wordle_letter:n \__wordle_letter_none:n},
+ NonLettres .code:n = {\cs_set_eq:NN \__wordle_letter:n \__wordle_letter_none:n},
+ letters .initial:n = true,
+
+ % forced letter case
+ natural~case .code:n = {
+ \cs_set_eq:NN \__wordle_letter:n \__wordle_letter_natural:n
+ },
+ lower~case .code:n = {
+ \cs_set_eq:NN \__wordle_letter:n \__wordle_letter_lower:n
+ \bool_set_false:N \l__wordle_case_sensitive_bool
+ },
+ upper~case .code:n = {
+ \cs_set_eq:NN \__wordle_letter:n \__wordle_letter_upper:n
+ \bool_set_false:N \l__wordle_case_sensitive_bool
+ },
+
+ % puzzle specs: rows and columns
+ rows .int_set:N = \l__wordle_rows_int,
+ Lignes .int_set:N = \l__wordle_rows_int,
+ rows .initial:n = 0,
+
+ strict .bool_set:N = \l__wordle_strict_bool,
+ Strict .bool_set:N = \l__wordle_strict_bool,
+ strict .default:n = true,
+ strict .initial:n = false,
+
+ % tikz settings
+ tile~style .tl_set:N = \l__wordle_tile_style_tl,
+ Style~case .tl_set:N = \l__wordle_tile_style_tl,
+ tile~style .initial:n = ,
+
+ name .tl_set:N = \l__wordle_name_tl,
+ Nom .tl_set:N = \l__wordle_name_tl,
+ name .initial:n = W,
+ tikz .tl_set:N = \l__wordle_tikz_tl,
+ tikz .initial:n = ,
+}
+
+% user settings
+\NewDocumentCommand\WordleSetup{ m }{ \keys_set:nn { wordle } {#1} }
+\NewDocumentCommand\ParamsSutom{ m }{ \keys_set:nn { wordle } {#1} }
+
+% ----------------------------------------------------------------
+% Define TikZ Wordle styles for the letters. Using tikz styles both
+% ensures consistency and has the added advantage of taking care of
+% expansion issues with the tile settings
+\tikzset{/Wordle/.is~family, /Wordle,
+ tile/.style = {
+ /tikz, % change back to using tikz keys
+ inner~sep = \l__wordle_sep_dim,
+ minimum~height = \l__wordle_size_dim,
+ minimum~size = \l__wordle_size_dim,
+ rounded~corners= \l__wordle_rounded_dim,
+ line~width = \l__wordle_thickness_dim,
+ font = \l__wordle_font_tl,
+ % scale = \fp_to_decimal:N \l__wordle_scale_fp,
+ text = \tl_use:c {l__wordle_#1_text_tl},
+ fill = \tl_use:c {l__wordle_#1_colour_tl},
+ shape = \tl_use:c {l__wordle_#1_shape_tl},
+ },
+ frame/.style = {
+ /Wordle/tile=#1,
+ /tikz, % change back to using tikz keys
+ draw = \tl_use:c{l__wordle_#1_border_tl},
+ minimum~size = {\l__wordle_size_dim+\l__wordle_thickness_dim},
+ fill = \tl_use:c {l__wordle_#1_colour_tl},
+ shape = rectangle,
+ },
+}
+
+% apply a TikZ setting
+\cs_new_nopar:Npn \__wordle_tikzset:n #1 { \exp_args:Nx \tikzset{#1} }
+
+% ----------------------------------------------------------------
+% preprocessing of the wordle letters
+\cs_new_nopar:Npn \__wordle_letter_none:n #1 {}
+\cs_new_nopar:Npn \__wordle_letter_natural:n #1 {#1}
+\cs_new_nopar:Npn \__wordle_letter_lower:n #1 { \str_lowercase:n {#1} }
+\cs_new_nopar:Npn \__wordle_letter_upper:n #1 { \str_uppercase:n {#1} }
+
+% by default wordle letters are not processed
+\cs_set_eq:NN \__wordle_letter:n \__wordle_letter_natural:n
+
+% Print a letter in a box as a node. There is slightly different behaviour
+% depending on whether the tile is frames or we are in strict mode. The way
+% that the entry is printed depends is controlled by \__wordle_letter:n.
+\cs_new_nopar:Npn \wordle__boxed_letter:nn #1#2
+{
+ % determine the node name, which takes the form <W>-<row>-<col>
+ \tl_set:No \l_tmpa_tl
+ {
+ \l__wordle_name_tl-\int_eval:n{1+\l__wordle_row_index_int}-\int_use:N\l__wordle_letter_index_int
+ }
+
+ % the construction of the node depends on whether the tile is framed
+ \tl_if_eq:cnTF {l__wordle_#1_frame_tl} {true}
+ {
+ % draw the frame
+ \node[/Wordle/frame=absent] % frame use the absent fill colour
+ at ({\l__wordle_letter_index_int*\l__wordle_grid_dim},{-\l__wordle_row_index_int*\l__wordle_grid_dim}){};
+ % draw the tile
+ \node[/Wordle/tile=#1]
+ (\l_tmpa_tl) at ({\l__wordle_letter_index_int*\l__wordle_grid_dim},
+ {-\l__wordle_row_index_int*\l__wordle_grid_dim})
+ { \l__wordle_align_tl\__wordle_letter:n {#2} };
+ }
+ {
+ % draw the tile, with a border
+ \node[/Wordle/frame=#1, /Wordle/tile=#1]
+ (\l_tmpa_tl) at ({\l__wordle_letter_index_int*\l__wordle_grid_dim},
+ {-\l__wordle_row_index_int*\l__wordle_grid_dim})
+ { \l__wordle_align_tl\__wordle_letter:n {#2} };
+ }
+
+ % if strict then put a slash through any extra letters
+ \bool_if:NT \l__wordle_strict_bool
+ {
+ \int_compare:nNnT {\l__wordle_letter_index_int} > {\seq_count:N \l__wordle_answer_seq }
+ {
+ \draw[red,ultra~thick] (\tl_use:N\l_tmpa_tl.south~west)--(\tl_use:N\l_tmpa_tl.north~east);
+ }
+ }
+}
+
+\seq_new:N \l__wordle_answer_seq % the answer
+\prop_new:N \l__wordle_answer_counts_prop % count letters in wordle
+\seq_new:N \l__wordle_solution_seq % list of all words
+\prop_new:N \l__wordle_word_counts_prop % count letters in word
+\int_new:N \l__wordle_letter_index_int % index of current letter in word
+\int_new:N \l__wordle_row_index_int % TikZ row index in solution
+
+% a conditional for non-negative prop counter in \l__wordle_word_counts_prop
+\prg_new_protected_conditional:Npnn \if__wordle_letter_nonnegative:n #1 {TF}
+{
+ \prop_if_in:NnTF \l__wordle_word_counts_prop {#1}
+ { % letter in in prop
+ \prop_get:NnN \l__wordle_word_counts_prop {#1} \l_tmpa_tl
+ \int_compare:nNnTF {\l_tmpa_tl} < {0}
+ {\prg_return_false:} {\prg_return_true:}
+ }
+ {\prg_return_false:}
+}
+
+\cs_generate_variant:Nn \str_if_eq:nVTF {xVTF}
+
+% a conditional for comparing letters
+\prg_new_protected_conditional:Npnn \if__wordle_letters_agree:n #1 {T, TF}
+{
+ \str_set:Nx \l_tmpa_str
+ {\seq_item:Nn \l__wordle_answer_seq {\l__wordle_letter_index_int}}
+
+
+ \bool_if:NTF \l__wordle_case_sensitive_bool
+ {\str_if_eq:nVTF {#1} \l_tmpa_str {\prg_return_true:} {\prg_return_false:}}
+ {\str_if_eq:xVTF {\str_uppercase:n{#1}} \l_tmpa_str {\prg_return_true:} {\prg_return_false:}}
+}
+
+% add #3 to <prop=#1>.#2
+\cs_new_nopar:Npn \wordle__add_to_prop_counter:Nnn #1#2#3
+{
+ \prop_put_if_new:Nnn #1 {#2} {0}
+ \prop_pop:NnN #1 {#2} \l_tmp_a
+ \prop_put:Nnx #1 {#2} {\int_eval:n {#3+\l_tmp_a}}
+}
+
+% make \l__wordle_answer_counts_prop<x> = #x's in wordle_seq
+\cs_new_nopar:Npn \wordle__count_letters_in_answer:n #1
+{
+ \wordle__add_to_prop_counter:Nnn \l__wordle_answer_counts_prop {#1} {1}
+}
+
+% first run: subtract correct matches from letter counts
+\cs_new_nopar:Npn \wordle__count_letters_in_word:n #1
+{
+ \int_incr:N \l__wordle_letter_index_int
+ \if__wordle_letters_agree:nT {#1}
+ { \wordle__add_to_prop_counter:Nnn \l__wordle_word_counts_prop {#1} {-1} }
+}
+
+% on the second run we print a coloured wordle word
+\cs_new_nopar:Npn \wordle__write_letters_in_word:n #1
+{
+ \int_incr:N \l__wordle_letter_index_int
+ \if__wordle_letters_agree:nTF {#1}
+ { \wordle__boxed_letter:nn {correct} {#1} }
+ {
+ % subtract 1 from the prop counter
+ \wordle__add_to_prop_counter:Nnn \l__wordle_word_counts_prop {#1} {-1}
+ % if the counter is non-negative this is a pseudo match
+ \if__wordle_letter_nonnegative:nTF {#1}
+ { \wordle__boxed_letter:nn {present} {#1} }
+ { \wordle__boxed_letter:nn {absent} {#1} }
+ }
+}
+
+\cs_generate_variant:Nn \seq_set_split:Nnn {Nnx}
+\cs_generate_variant:Nn \cs_set_nopar:Nn {NV}
+
+% typeset the word "#1", colouring letters using the wordle convention
+\cs_new_nopar:Npn \wordle__mark_word:n #1
+{
+ \str_if_eq:nnTF {#1} {*}
+ {
+ \cs_set_eq:NN \wordle__process_word:n \wordle__empty_word:n
+ }
+ {
+ \prop_set_eq:NN \l__wordle_word_counts_prop \l__wordle_answer_counts_prop
+ \tl_map_function:nN {#1} \wordle__count_letters_in_word:n
+ \int_zero:N \l__wordle_letter_index_int
+ \tl_map_function:nN {#1} \wordle__write_letters_in_word:n
+
+ % if strict then check lengths
+ \bool_if:NT \l__wordle_strict_bool
+ {
+ \int_while_do:nNnn {\l__wordle_letter_index_int} < {\seq_count:N\l__wordle_answer_seq}
+ {
+ \int_incr:N \l__wordle_letter_index_int
+ \wordle__boxed_letter:nn {absent} {\c_space_tl}
+ }
+ }
+
+ % increment the row index
+ \int_incr:N \l__wordle_row_index_int
+ }
+}
+
+% typeset the word "#1" by putting boxes around each letter
+\cs_new_nopar:Npn \wordle__empty_word:n #1
+{
+ \tl_map_inline:nn {#1}
+ {
+ \int_incr:N \l__wordle_letter_index_int
+ \wordle__boxed_letter:nn {empty} {##1}
+ }
+ % if strict then check lengths
+ \bool_if:NT \l__wordle_strict_bool
+ {
+ \int_while_do:nNnn {\l__wordle_ltter_index_int} < {\seq_count:N\l__wordle_answer_seq}
+ {
+ \int_incr:N \l__wordle_letter_index_int
+ \wordle__boxed_letter:nn {empty} {\c_space_tl}
+ }
+ }
+ \int_incr:N \l__wordle_row_index_int
+}
+
+\cs_set_eq:NN \wordle__process_word:n \wordle__mark_word:n
+
+\NewDocumentEnvironment{wordle}{ O{} m O{} b }
+{
+ % apply wordle environment options
+ \WordleSetup{#1}
+ \begin{tikzpicture}
+
+ % apply any tikz settings -- we need to some expansion trickery to do this
+ \__wordle_tikzset:n {\l__wordle_tikz_tl}
+ \__wordle_tikzset:n {/Wordle/tile/.append~style={\l__wordle_depth_tl,\l__wordle_tile_style_tl}}
+
+ % set grid dimension = box size + separation
+ \dim_set:Nn \l__wordle_grid_dim {\l__wordle_size_dim+\l__wordle_sep_dim}
+
+ % split the answer into letters
+ \bool_if:NTF \l__wordle_case_sensitive_bool
+ { \seq_set_split:Nnn \l__wordle_answer_seq {} {#2} }
+ { \seq_set_split:Nnx \l__wordle_answer_seq {} {\str_uppercase:n {#2}} }
+
+ % count the number of times letters appear in \l__wordle_answer_seq
+ \prop_clear:N \l__wordle_answer_counts_prop
+ \tl_map_function:nN {#2} \wordle__count_letters_in_answer:n
+
+ % split the solution into words
+ \regex_split:nnN {\s} {#4} \l__wordle_solution_seq
+
+ % process the words
+ \int_zero:N \l__wordle_row_index_int
+ \seq_map_inline:Nn \l__wordle_solution_seq
+ {
+ \int_zero:N \l__wordle_letter_index_int
+ \wordle__process_word:n {##1}
+ }
+
+ % if required, add extra required blank rows
+ \int_while_do:nNnn {\l__wordle_row_index_int} < {\l__wordle_rows_int}
+ {
+ \int_zero:N \l__wordle_letter_index_int
+ \int_while_do:nNnn {\l__wordle_letter_index_int} < {\seq_count:N\l__wordle_answer_seq}
+ {
+ \int_incr:N \l__wordle_letter_index_int
+ \wordle__boxed_letter:nn {empty} {\c_space_tl}
+ }
+ \int_incr:N \l__wordle_row_index_int
+ }
+
+ % finally, execute the optional TikZ commands
+ #3
+
+ \end{tikzpicture}
+}{}
+
+% wrapper environment for Gridwordle
+\NewDocumentEnvironment{GridWordle}{ O{} m O{} b }
+ {
+ \begin{wordle}[#1]{#2}[#3]#4]\end{wordle}
+ }
+ {}
+
+% wrapper environment for GrilleSutom
+\NewDocumentEnvironment{GrilleSutom}{ O{} m O{} b }
+ {
+ \begin{wordle}[style=sutom,#1]{#2}[#3]#4\end{wordle}
+ }
+ {}
+
+\endinput
+
+% ----------------------------------------------------------------
+% CHANGE LOG
+%
+% Version 0.3 - \wordle@release
+% - merged AM & CP packages, adding styles and streamlining options, french keys
+%
+% Version 0.2 - \wordle@release
+% - added documentation and cleaned some of the options
+%
+% Version 0.1 - 2022-10-01
+% - initial version
+%
+% ----------------------------------------------------------------
+%
+% Copyright (C) 2022-3 by Andrew Mathas <andrew.mathas@gmail.com>
+% and Cédric Pierquet cpierquet@outlook.fr
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License (LPPL), either
+% version 1.3c of this license or (at your option) any later
+% version. The latest version of this license is in the file:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% This work is "maintained" (as per LPPL maintenance status) by
+% Andrew Mathas.
+%
+% This work consists of the files:
+% wordle.sty
+% wordle.tex