diff --git a/packages/preview/quati-abnt/0.1.0/LICENSE b/packages/preview/quati-abnt/0.1.0/LICENSE
new file mode 100644
index 0000000000..3c805b55db
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/LICENSE
@@ -0,0 +1,660 @@
+# GNU AFFERO GENERAL PUBLIC LICENSE
+
+Version 3, 19 November 2007
+
+Copyright (C) 2007 Free Software Foundation, Inc.
+
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+## Preamble
+
+The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains
+free software for all its users.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing
+under this license.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+## TERMS AND CONDITIONS
+
+### 0. Definitions
+
+"This License" refers to version 3 of the GNU Affero General Public
+License.
+
+"Copyright" also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
+
+"The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of
+an exact copy. The resulting work is called a "modified version" of
+the earlier work or a work "based on" the earlier work.
+
+A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user
+through a computer network, with no transfer of a copy, is not
+conveying.
+
+An interactive user interface displays "Appropriate Legal Notices" to
+the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+### 1. Source Code
+
+The "source code" for a work means the preferred form of the work for
+making modifications to it. "Object code" means any non-source form of
+a work.
+
+A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same
+work.
+
+### 2. Basic Permissions
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright. Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the
+conditions stated below. Sublicensing is not allowed; section 10 makes
+it unnecessary.
+
+### 3. Protecting Users' Legal Rights From Anti-Circumvention Law
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such
+circumvention is effected by exercising rights under this License with
+respect to the covered work, and you disclaim any intention to limit
+operation or modification of the work as a means of enforcing, against
+the work's users, your or third parties' legal rights to forbid
+circumvention of technological measures.
+
+### 4. Conveying Verbatim Copies
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+### 5. Conveying Modified Source Versions
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these
+conditions:
+
+- a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+- b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under
+ section 7. This requirement modifies the requirement in section 4
+ to "keep intact all notices".
+- c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+- d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+### 6. Conveying Non-Source Forms
+
+You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these
+ways:
+
+- a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+- b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the Corresponding
+ Source from a network server at no charge.
+- c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+- d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+- e) Convey the object code using peer-to-peer transmission,
+ provided you inform other peers where the object code and
+ Corresponding Source of the work are being offered to the general
+ public at no charge under subsection 6d.
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal,
+family, or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling. In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of
+coverage. For a particular product received by a particular user,
+"normally used" refers to a typical or common use of that class of
+product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected
+to use, the product. A product is a consumer product regardless of
+whether the product has substantial commercial, industrial or
+non-consumer uses, unless such uses represent the only significant
+mode of use of the product.
+
+"Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to
+install and execute modified versions of a covered work in that User
+Product from a modified version of its Corresponding Source. The
+information must suffice to ensure that the continued functioning of
+the modified object code is in no case prevented or interfered with
+solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or
+updates for a work that has been modified or installed by the
+recipient, or for the User Product in which it has been modified or
+installed. Access to a network may be denied when the modification
+itself materially and adversely affects the operation of the network
+or violates the rules and protocols for communication across the
+network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+### 7. Additional Terms
+
+"Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
+
+- a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+- b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+- c) Prohibiting misrepresentation of the origin of that material,
+ or requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+- d) Limiting the use for publicity purposes of names of licensors
+ or authors of the material; or
+- e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+- f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions
+ of it) with contractual assumptions of liability to the recipient,
+ for any liability that these contractual assumptions directly
+ impose on those licensors and authors.
+
+All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the
+above requirements apply either way.
+
+### 8. Termination
+
+You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+### 9. Acceptance Not Required for Having Copies
+
+You are not required to accept this License in order to receive or run
+a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+### 10. Automatic Licensing of Downstream Recipients
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+### 11. Patents
+
+A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+A contributor's "essential patent claims" are all patent claims owned
+or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is "discriminatory" if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License. You may not convey a covered work if you
+are a party to an arrangement with a third party that is in the
+business of distributing software, under which you make payment to the
+third party based on the extent of your activity of conveying the
+work, and under which the third party grants, to any of the parties
+who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by
+you (or copies made from those copies), or (b) primarily for and in
+connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+### 12. No Surrender of Others' Freedom
+
+If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under
+this License and any other pertinent obligations, then as a
+consequence you may not convey it at all. For example, if you agree to
+terms that obligate you to collect a royalty for further conveying
+from those to whom you convey the Program, the only way you could
+satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
+
+### 13. Remote Network Interaction; Use with the GNU General Public License
+
+Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your
+version supports such interaction) an opportunity to receive the
+Corresponding Source of your version by providing access to the
+Corresponding Source from a network server at no charge, through some
+standard or customary means of facilitating copying of software. This
+Corresponding Source shall include the Corresponding Source for any
+work covered by version 3 of the GNU General Public License that is
+incorporated pursuant to the following paragraph.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+### 14. Revised Versions of this License
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU Affero General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever
+published by the Free Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions
+of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+### 15. Disclaimer of Warranty
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
+WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+### 16. Limitation of Liability
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
+NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+### 17. Interpretation of Sections 15 and 16
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+END OF TERMS AND CONDITIONS
+
+## How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+To do so, attach the following notices to the program. It is safest to
+attach them to the start of each source file to most effectively state
+the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper
+mail.
+
+If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for
+the specific requirements.
+
+You should also get your employer (if you work as a programmer) or
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. For more information on this, and how to apply and follow
+the GNU AGPL, see .
diff --git a/packages/preview/quati-abnt/0.1.0/README.md b/packages/preview/quati-abnt/0.1.0/README.md
new file mode 100644
index 0000000000..14ee39d673
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/README.md
@@ -0,0 +1,228 @@
+# quati-abnt
+
+Compose documents according to ABNT standards.
+
+## Initialization
+
+In order to create a new project using this template, you can either:
+
+- use the following command when running typst **locally**;
+
+```bash
+typst init @preview/quati-abnt:0.1.0
+```
+
+- or select [this template](https://typst.app/universe/package/quati-abnt) on the Typst **web app**.
+
+This will create two folders: `article`, intended for scientific papers, and `academic_work`, intended for dissertations, theses, and monographs.
+
+```filesystem
+.
+├── article
+│ └── main.typ
+└── academic_work
+ └── main.typ
+```
+
+Each folder contains a `main.typ` file, which is the entry point for the document.
+
+If you do not intend on using one of the templates, you can **delete** the corresponding folder.
+
+After that, select the `main.typ` file on the **desired template** to render the document.
+
+On the `/packages.typ` file inside each template folder, you will find the importing of the `quati-abnt` package.
+
+```typst
+#import "@preview/quati-abnt:0.1.0" as quati-abnt
+```
+
+## Paper template
+
+The `article` template is intended for scientific **papers**.
+
+### Main file
+
+To render the paper, select the `/main.typ` file.
+
+This file initializes the template, offering options to configure it.
+
+```typst
+#show: it => quati-abnt.article.template(
+ it,
+
+ // Define the color of links and cross-references.
+ // Defina a cor dos links e das referências cruzadas.
+ color_of_links: quati-abnt.common.style.color_of_links,
+
+ // Define the font family to be used on each context.
+ // Defina a família tipográfica a ser utilizada em cada contexto.
+ font_family_for_common_text: quati-abnt.common.style.font_family_serif,
+ font_family_for_highlighted_text: quati-abnt.common.style.font_family_sans,
+ font_family_for_math_text: quati-abnt.common.style.font_family_math,
+ font_family_for_monospaced_text: quati-abnt.common.style.font_family_mono,
+ font_family_for_editor_notes: quati-abnt.common.style.font_family_sans,
+
+ // Define whether to use larger text as typographic highlight instead of uppercase.
+ // Defina se deve ser utilizada uma fonte maior como destaque tipográfico em vez de caixa-alta.
+ should_use_larger_text_to_highlight: false,
+
+ // Define whether to count pages and place its numbers at the headers.
+ // Defina se deve contar as páginas e exibir seus números nos cabeçalhos.
+ should_number_pages: true,
+
+ // Define whether to display editor notes.
+ // Defina se deve exibir as notas de editor.
+ should_display_editor_notes: true,
+)
+```
+
+### Packages
+
+Still on the root folder, you can include more Typst packages on the `/packages.typ` file.
+This template depends on these packages, which are already re-exported to your project: `glossarium`.
+
+### Components
+
+You can define your own components on the `/components.typ` file.
+We have already set some exemples of editor notes for you to edit.
+
+```typst
+#let note_from_alice = (
+ note: editor_note,
+ it,
+) => {
+ let color = oklch(80.43%, 0.1, 278.25deg)
+ note(
+ prefixes: (
+ (
+ body: "Alice",
+ fill: color,
+ stroke: color.saturate(25%),
+ ),
+ ),
+ it,
+ )
+}
+```
+
+### Data
+
+Set the following data on the `/data/data.typ` file:
+
+- title;
+- subtitle (optional);
+- author(s).
+
+Then, you can include your references on the `data/bibliography.bib` file.
+
+If you want, you can set abbreviations, glossary entries, and symbols on the `/data/glossary.typ` file.
+
+Also, you can set commonly used terms that should not be included in the glossary on the `/data/terms.typ` file.
+
+### Pre-textual elements
+
+On the `/content/pre_textual.typ` file, you can set the title in a foreign language, which is optional.
+
+Then, write the abstract and the keywords in the main language.
+
+```typst
+// ## Abstract. Resumo.
+#let abstract_in_main_language = {
+ (
+ keywords_title: "Palavras-chave",
+ keywords: (
+ "modelo",
+ "artigo",
+ "ABNT",
+ "Typst",
+ ),
+ title: "Resumo",
+ body: [
+ Este exemplo apresenta o uso do `quati-abnt`, modelo de artigo para o Typst segundo as @nbr:pl da @abnt.
+ ],
+ )
+}
+```
+
+You can optionally set the abstract and keywords in foreign languages on the same file.
+
+### Content
+
+Finally, you can write the content of your paper on the `/content/textual/main.typ` file.
+
+Feel free to create more files and folders to organize your content, if you want.
+You can include those files on the `/content/textual/main.typ` file using the `#include` command.
+
+```typst
+#include "./introduction.typ"
+```
+
+### Post-textual elements
+
+On the `/content/post_textual.typ` file, you can set the appendices, annexes, and an acknowledgment section.
+All of these elements are optional.
+
+## Monograph template
+
+The `academic_work` template is intended for **dissertations**, **theses**, and **monographs**.
+
+The structure of this template is similar to the `article` template, but it has more pre-textual and post-textual elements.
+
+This section only covers the differences between the two templates.
+
+### Data
+
+Set the following data on the `/data/data.typ` file:
+
+- title;
+- subtitle (optional);
+- author(s);
+- advisor(s);
+- members of the examination committee;
+- organization (university);
+- institution (faculty) (optional);
+- department (optional);
+- program (or course) (semi-optional);
+- type of work (dissertation, thesis, or monograph);
+- degree (semi-optional);
+- degree topic;
+- concentration area (optional);
+- address;
+- year;
+- volume number (optional);
+- approval date (optional).
+
+If you prefer to write a custom nature paragraph, you can fill the `custom_nature` field with your own content.
+In that case, the `program` and `degree` fields will be ignored.
+
+### Pre-textual elements
+
+On the `/content/pre_textual.typ` file, you can write the contents of the errata page, the dedication page, the acknowledgments page, and the epigraph page.
+
+All of these elements are optional.
+If you do not want to include one of them, just remove the respective inclusion command.
+
+On the `/content/abstract.typ` file, you can write the abstract and keywords in the main language and in foreign languages.
+
+### Content
+
+Finally, you can write the content of your work on the `/content/textual/main.typ` file.
+
+Feel free to create more files and folders to organize your content, if you want.
+You can include those files on the `/content/textual/main.typ` file using the `#include` command.
+
+```typst
+#include "./introduction.typ"
+```
+
+Its usual for a monograph to have these chapters:
+
+- introduction (_introdução_);
+- theoretical foundation (_fundamentação teórica_);
+- material and methods (_material e métodos_);
+- results (_resultados_);
+- final considerations (_considerações finais_).
+
+### Post-textual elements
+
+On the `/content/post_textual.typ` file, you can set the appendices and annexes.
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/advisors.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/advisors.typ
new file mode 100644
index 0000000000..828f4ac919
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/advisors.typ
@@ -0,0 +1,50 @@
+// # Advisors. Orientadores.
+
+#import "../../common/components/text.typ": capitalize_first_letter
+#import "../components/people.typ": print_person
+
+
+#let get_advisor_role(
+ gender: "m",
+ is_co_advisor: false,
+) = {
+ if is_co_advisor {
+ "co"
+ }
+ "orientador"
+ if gender == "f" {
+ "a"
+ }
+}
+
+
+#let print_advisors = (
+ advisors: {
+ (
+ (
+ first_name: "Ciclana",
+ middle_name: "de",
+ last_name: "Castro",
+ gender: "f",
+ prefix: {
+ // "Profª Drª"
+ },
+ organization: (
+ name: "Nome da organização",
+ gender: "f",
+ ),
+ ),
+ )
+ },
+) => {
+ let is_first_advisor = true
+ for advisor in advisors {
+ [
+ #capitalize_first_letter(get_advisor_role(gender: advisor.gender, is_co_advisor: not is_first_advisor)):
+ #advisor.prefix
+ #print_person(person: advisor)
+ #linebreak()
+ ]
+ is_first_advisor = false
+ }
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/entry_on_outline_lists.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/entry_on_outline_lists.typ
new file mode 100644
index 0000000000..f9f6993e74
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/entry_on_outline_lists.typ
@@ -0,0 +1,11 @@
+// # Outline entry. Entrada de sumário.
+
+#let format_outline_entry = it => {
+ link(
+ it.element.location(),
+ it.indented(
+ it.prefix(),
+ sym.dash.em + sym.space + it.inner(),
+ ),
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/entry_on_simple_glossary_lists.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/entry_on_simple_glossary_lists.typ
new file mode 100644
index 0000000000..0368dae48f
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/entry_on_simple_glossary_lists.typ
@@ -0,0 +1,36 @@
+// # Entry on simple glossary list. Entrada em lista simples de glossário.
+
+#import "../../common/style/style.typ": spacing_for_common_text
+#import "../../common/packages.typ": glossarium
+
+#let print_title = entry => {
+ (
+ grid(
+ columns: (1fr, 4fr),
+ column-gutter: spacing_for_common_text,
+ align: top,
+
+ strong(entry.short), entry.long,
+ )
+ )
+}
+
+#let print_description = entry => {}
+
+#let print_back_references = entry => {}
+
+#let print_gloss = (
+ deduplicate-back-references: true,
+ description-separator: "",
+ disable-back-references: false,
+ minimum-refs: 1,
+ show-all: false,
+ user-print-back-references: print_back_references,
+ user-print-description: print_description,
+ user-print-title: print_title,
+ entry,
+) => context {
+ if glossarium.count-refs(entry.key) != 0 {
+ print_title(entry)
+ }
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/epigraph.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/epigraph.typ
new file mode 100644
index 0000000000..d7b0237f53
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/epigraph.typ
@@ -0,0 +1,17 @@
+// # Epigraph. Epígrafe.
+// NBR 14724:2024 4.2.1.6
+
+#import "../../common/components/quote.typ": format_quote
+
+// NBR 14724:2024 4.2.1.6, NBR 14724:2024 5.2.4, NBR 14724:2024 5.5
+#let include_epigraph(
+ indent: true,
+ smaller_text: true,
+ body,
+) = context {
+ show quote: it => format_quote(
+ indent: indent,
+ smaller_text: smaller_text,
+ )[#it]
+ body
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/examiner.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/examiner.typ
new file mode 100644
index 0000000000..9844b2b5c1
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/examiner.typ
@@ -0,0 +1,43 @@
+// # Examiner Signature. Assinatura do examinador.
+// NBR 14724:2024 4.2.1.3
+
+#import "../../common/style/style.typ": leading_for_common_text
+#import "../../common/components/text.typ": capitalize_first_letter
+#import "../components/people.typ": print_person
+
+#let print_examiner(
+ examiner: (
+ first_name: "Ciclana",
+ middle_name: "de",
+ last_name: "Castro",
+ gender: "f",
+ prefix: {
+ // "Profª Drª"
+ },
+ organization: (
+ name: "Nome da organização",
+ gender: "f",
+ ),
+ ),
+ role: {
+ "orientador"
+ },
+) = {
+ block(
+ above: 1.5cm,
+ )[
+ #block(below: leading_for_common_text)[
+ #line(length: 100%)
+ ]
+ #par()[
+ #examiner.prefix
+ #print_person(person: examiner)
+ #if role != none [
+ #sym.dash.en
+ #capitalize_first_letter(role)
+ ]
+ #linebreak()
+ #examiner.organization.name
+ ]
+ ]
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/heading.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/heading.typ
new file mode 100644
index 0000000000..9a15549418
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/heading.typ
@@ -0,0 +1,40 @@
+// # Headings. Títulos.
+
+#import "../../common/components/heading.typ": format_heading as format_heading_from_common
+#import "./page.typ": should_consider_only_odd_pages
+
+#let should_start_on_new_page = state(
+ "should_start_on_new_page",
+ true,
+)
+
+#let not_start_on_new_page(
+ body,
+) = {
+ should_start_on_new_page.update(false)
+ body
+ should_start_on_new_page.update(true)
+}
+
+#let format_heading(
+ should_use_larger_text_to_highlight: false,
+ body,
+) = context {
+ // NBR 14724:2024 5.2.2.
+
+ // Level 1 headings should start on a new page.
+ if body.level == 1 {
+ if should_start_on_new_page.get() {
+ // If considering odd/even pages, sections should start on odd pages
+ if not should_consider_only_odd_pages.get() {
+ pagebreak(weak: true, to: "odd")
+ }
+ pagebreak(weak: true)
+ }
+ }
+
+ format_heading_from_common(
+ should_use_larger_text_to_highlight: should_use_larger_text_to_highlight,
+ body,
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/institutional_information.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/institutional_information.typ
new file mode 100644
index 0000000000..abdcf0dfae
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/institutional_information.typ
@@ -0,0 +1,49 @@
+// # Institutional information. Informações institucionais.
+// NBR 14724:2024 4.2.1.3
+
+#let print_institutional_information(
+ organization: {
+ (
+ name: "Nome da organização",
+ gender: "m",
+ )
+ },
+ institution: {
+ // (
+ // name: "Nome da instituição",
+ // gender: "m",
+ // )
+ },
+ department: {
+ // (
+ // name: "Nome do departamento",
+ // gender: "m",
+ // )
+ },
+ program: {
+ // (
+ // name: "Nome do programa",
+ // gender: "m",
+ // )
+ },
+ joiner: {
+ linebreak()
+ },
+) = {
+ [
+ // CDC UFJF 2023 recommends to use uppercase, although it is optional
+ #organization.name
+ #if institution != none [
+ #joiner
+ #institution.name
+ ]
+ #if department != none [
+ #joiner
+ #department.name
+ ]
+ #if program != none [
+ #joiner
+ #program.name
+ ]
+ ]
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/list_of_figures.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/list_of_figures.typ
new file mode 100644
index 0000000000..ddace60352
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/list_of_figures.typ
@@ -0,0 +1,23 @@
+// # List of figures. Lista de ilustrações.
+// NBR 14724:2024 4.2.1.9
+
+#import "../../common/components/font_family.typ": font_family_for_highlighted_text_state
+#import "../components/entry_on_outline_lists.typ": format_outline_entry
+
+#let include_list_of_figures() = context {
+ set text(
+ font: font_family_for_highlighted_text_state.get(),
+ )
+
+ show outline.entry: it => {
+ let kind = it.element.kind
+ if kind != table {
+ format_outline_entry(it)
+ }
+ }
+
+ outline(
+ title: "Lista de ilustrações",
+ target: figure,
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/list_of_tables.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/list_of_tables.typ
new file mode 100644
index 0000000000..d17832a1c7
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/list_of_tables.typ
@@ -0,0 +1,18 @@
+// # List of tables. Lista de tabelas.
+// NBR 14724:2024 4.2.1.10
+
+#import "../../common/components/font_family.typ": font_family_for_highlighted_text_state
+#import "../components/entry_on_outline_lists.typ": format_outline_entry
+
+#let include_list_of_tables() = context {
+ set text(
+ font: font_family_for_highlighted_text_state.get(),
+ )
+
+ show outline.entry: format_outline_entry
+
+ outline(
+ title: "Lista de tabelas",
+ target: figure.where(kind: table),
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/main.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/main.typ
new file mode 100644
index 0000000000..4589521697
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/main.typ
@@ -0,0 +1,4 @@
+// # Components. Componentes.
+
+#import "./epigraph.typ": include_epigraph
+#import "./people.typ": print_people, print_person
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/nature.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/nature.typ
new file mode 100644
index 0000000000..2933217e82
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/nature.typ
@@ -0,0 +1,80 @@
+// # Nature of the work. Natureza do trabalho.
+// NBR 14724:2024 4.2.1.1.1, NBR 14724:2024 4.2.1.3
+
+#import "../../common/components/gender.typ": get_gender_ending
+#import "../../common/components/text.typ": capitalize_first_letter
+
+#let print_nature(
+ authors: {
+ (
+ (
+ first_name: "Fulano",
+ middle_name: none,
+ last_name: "Fonseca",
+ gender: "m",
+ ),
+ )
+ },
+ organization: {
+ (
+ name: "Nome da organização",
+ gender: "m",
+ )
+ },
+ program: {
+ (
+ name: "Nome do programa",
+ gender: "m",
+ )
+ },
+ type_of_work: {
+ (
+ name: "trabalho de conclusão de curso",
+ gender: "m",
+ )
+ },
+ degree: {
+ (
+ name: "bacharelado",
+ title: (
+ masculine: "bacharel",
+ feminine: "bacharela",
+ ),
+ )
+ },
+ degree_topic: { "Tema do trabalho" },
+ area_of_concentration: {
+ // "Área de concentração"
+ },
+) = {
+ let gender_ending_of_type_of_work = get_gender_ending(type_of_work.gender)
+
+ let preposition_of_program = "à"
+ if program.gender == "m" {
+ preposition_of_program = "ao"
+ }
+
+ let degree_title = degree.title.feminine
+ for author in authors {
+ if author.gender == "m" {
+ degree_title = degree.title.masculine
+ break
+ }
+ }
+
+ [
+ #capitalize_first_letter(type_of_work.name)
+ apresentad#gender_ending_of_type_of_work
+ #preposition_of_program
+ #program.name
+ d#get_gender_ending(organization.gender)
+ #organization.name
+ como requisito parcial
+ à obtenção do título de
+ #capitalize_first_letter(degree_title) em
+ #degree_topic.
+ #if area_of_concentration != none [
+ Área de concentração: #area_of_concentration.
+ ]
+ ]
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/page.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/page.typ
new file mode 100644
index 0000000000..16f94ece3f
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/page.typ
@@ -0,0 +1,69 @@
+// # Page. Página.
+
+#import "../../common/style/style.typ": font_size_for_smaller_text
+#import "../../common/components/font_family.typ": font_family_for_common_text_state
+
+
+#let should_number_this_page = state("quati_abnt_should_number_this_page", true)
+#let should_count_this_page = state("quati_abnt_should_count_this_page", true)
+
+#let should_consider_only_odd_pages = state("quati_abnt_should_consider_only_odd_pages", true)
+
+#let quantity_of_counted_pages = state("quati_abnt_quantity_of_counted_pages", 0)
+
+#let not_number_page(
+ body,
+) = {
+ should_number_this_page.update(false)
+ body
+ should_number_this_page.update(true)
+}
+
+#let not_count_page(
+ body,
+) = {
+ should_count_this_page.update(false)
+ body
+ should_count_this_page.update(true)
+}
+
+#let format_header(
+ should_number_pages: true,
+) = context {
+ // Regress page counter if this page should not be counted
+ let actual_page_number = here().page()
+ let page_number_to_display = quantity_of_counted_pages.get()
+
+ if should_count_this_page.get() {
+ page_number_to_display += 1
+ quantity_of_counted_pages.update(n => n + 1)
+ } else {
+ counter(page).update(n => n - 1)
+ }
+
+ // NBR 14724:2024 5.3
+ // Numbering should be on the right for odd pages and on the left for even pages.
+ let alignment = if should_consider_only_odd_pages.get() {
+ end
+ } else {
+ if calc.rem(actual_page_number, 2) == 1 {
+ end
+ } else {
+ start
+ }
+ }
+
+ if should_number_pages {
+ // Display page number in the header
+ if should_number_this_page.get() {
+ align(alignment)[
+ #text(
+ font: font_family_for_common_text_state.get(),
+ size: font_size_for_smaller_text,
+ )[
+ #page_number_to_display
+ ]
+ ]
+ }
+ }
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/components/people.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/people.typ
new file mode 100644
index 0000000000..19875d795e
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/components/people.typ
@@ -0,0 +1,40 @@
+// # People. Pessoas.
+
+#let print_person(
+ person: (
+ first_name: "Fulano",
+ middle_name: none,
+ last_name: "Fonseca",
+ gender: "m",
+ ),
+ last_name_first: false,
+) = {
+ if last_name_first {
+ person.last_name + ", "
+ person.first_name
+ if person.middle_name != none {
+ sym.space + person.middle_name
+ }
+ } else {
+ person.first_name
+ if person.middle_name != none {
+ sym.space + person.middle_name
+ }
+ sym.space
+ person.last_name
+ }
+}
+
+#let print_people(
+ people: (),
+ joiner: ", ",
+) = {
+ (
+ people
+ .map(person => print_person(
+ person: person,
+ last_name_first: false,
+ ))
+ .join(joiner)
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/main.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/main.typ
new file mode 100644
index 0000000000..4e6160e046
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/main.typ
@@ -0,0 +1,5 @@
+// # Academic work. Trabalho acadêmico.
+
+#import "./components/main.typ" as components
+#import "./pages/main.typ" as pages
+#import "./template.typ": template
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/external/cover.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/external/cover.typ
new file mode 100644
index 0000000000..d6c68f53ab
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/external/cover.typ
@@ -0,0 +1,106 @@
+// # Cover. Capa.
+// NBR 14724:2024 4.1.1
+
+#import "../../../common/components/title.typ": print_title
+#import "../../../common/components/font_family.typ": font_family_for_highlighted_text_state
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/institutional_information.typ": print_institutional_information
+#import "../../components/page.typ": not_count_page, not_number_page, should_consider_only_odd_pages
+#import "../../components/people.typ": print_people
+
+#let include_cover(
+ organization: {
+ (
+ name: "Nome da organização",
+ gender: "m",
+ )
+ },
+ institution: {
+ // (
+ // name: "Nome da instituição",
+ // gender: "m",
+ // )
+ },
+ program: {
+ // (
+ // name: "Nome do programa",
+ // gender: "m",
+ // )
+ },
+ authors: {
+ (
+ (
+ first_name: "Fulano",
+ middle_name: none,
+ last_name: "Fonseca",
+ gender: "m",
+ ),
+ )
+ },
+ title: { "Título do trabalho" },
+ subtitle: {
+ // "Subtítulo do trabalho"
+ },
+ volume_number: {
+ // "1"
+ },
+ address: { "Local" },
+ year: { "Ano" },
+) = context {
+ not_number_page(
+ not_count_page(
+ not_start_on_new_page()[
+ #page()[
+ #set align(center)
+ #set text(
+ font: font_family_for_highlighted_text_state.get(),
+ )
+
+ // Institutional information
+ #text(
+ weight: "bold",
+ )[
+ #print_institutional_information(
+ organization: organization,
+ program: program,
+ institution: institution,
+ )
+ ]
+
+ #v(0.5fr)
+
+ // Authors
+ #strong[
+ #print_people(
+ people: authors,
+ )
+ ]
+
+ #v(0.5fr)
+
+ // Title
+ #print_title(
+ title: title,
+ subtitle: subtitle,
+ with_weight: true,
+ )
+
+ #v(1fr)
+
+ // Publishing information
+ #if volume_number != none [
+ Volume #volume_number
+ #parbreak()
+ ]
+ #address
+ #linebreak()
+ #year
+ ]
+
+ #if not should_consider_only_odd_pages.get() {
+ pagebreak(weak: true, to: "odd")
+ }
+ ],
+ ),
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/main.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/main.typ
new file mode 100644
index 0000000000..4129b3ab07
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/main.typ
@@ -0,0 +1,18 @@
+// # Pages. Páginas.
+
+#import "./external/cover.typ": include_cover
+#import "./pre_textual/abstract.typ": include_abstract_page
+#import "./pre_textual/acknowledgments.typ": include_acknowledgments_page
+#import "./pre_textual/approval_page.typ": include_approval_page
+#import "./pre_textual/cataloging_in_publication.typ": include_cataloging_in_publication
+#import "./pre_textual/custom_cataloging_in_publication.typ": include_custom_cataloging_in_publication
+#import "./pre_textual/dedication.typ": include_dedication_page
+#import "./pre_textual/epigraph.typ": include_epigraph_page
+#import "./pre_textual/errata.typ": include_errata_page
+#import "./pre_textual/list_of_abbreviations.typ": include_list_of_abbreviations_page
+#import "./pre_textual/list_of_figures.typ": include_list_of_figures_page
+#import "./pre_textual/list_of_symbols.typ": include_list_of_symbols_page
+#import "./pre_textual/list_of_tables.typ": include_list_of_tables_page
+#import "./pre_textual/outline.typ": include_outline_page
+#import "./pre_textual/title_page.typ": include_title_page
+#import "./post_textual/glossary.typ": include_glossary_page
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/post_textual/glossary.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/post_textual/glossary.typ
new file mode 100644
index 0000000000..43480d1d3c
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/post_textual/glossary.typ
@@ -0,0 +1,44 @@
+// # Glossary. Glossário.
+// NBR 14724:2024 4.2.3.2
+
+#import "../../../common/components/glossary.typ": include_glossary
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/page.typ": should_consider_only_odd_pages
+
+#let include_glossary_page(
+ disable_back_references: true,
+ invisible: false,
+ print_gloss: none,
+ title: "Glossário",
+ outlined: true,
+ entries,
+) = context {
+ let arguments = (
+ disable_back_references: disable_back_references,
+ invisible: invisible,
+ print_gloss: print_gloss,
+ title: title,
+ outlined: outlined,
+ )
+
+ // If the glossary must not be printed, no page will be crated for it
+ if (invisible == true) {
+ include_glossary(
+ ..arguments,
+ entries,
+ )
+ } else {
+ not_start_on_new_page()[
+ #page()[
+ #include_glossary(
+ ..arguments,
+ entries,
+ )
+ ]
+
+ #if not should_consider_only_odd_pages.get() {
+ pagebreak(weak: true, to: "odd")
+ }
+ ]
+ }
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/abstract.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/abstract.typ
new file mode 100644
index 0000000000..a62d782bd5
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/abstract.typ
@@ -0,0 +1,36 @@
+// # Abstract. Resumo.
+// NBR 14724:2024 4.2.1.7, NBR 14724:2024 4.2.1.8
+
+#import "../../../common/components/abstract.typ": include_abstract
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/page.typ": not_number_page, should_consider_only_odd_pages
+
+#let include_abstract_page(
+ keywords_title: { "Palavras-chave" },
+ keywords: {
+ (
+ "primeira palavra-chave",
+ "segunda palavra-chave",
+ "terceira palavra-chave",
+ )
+ },
+ title: { "Resumo" },
+ body: { "Conteúdo do resumo." },
+) = context {
+ not_number_page(
+ not_start_on_new_page()[
+ #page()[
+ #include_abstract(
+ body: body,
+ keywords_title: keywords_title,
+ keywords: keywords,
+ title: title,
+ )
+ ]
+
+ #if not should_consider_only_odd_pages.get() {
+ pagebreak(weak: true, to: "odd")
+ }
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/acknowledgments.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/acknowledgments.typ
new file mode 100644
index 0000000000..c0394a2063
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/acknowledgments.typ
@@ -0,0 +1,27 @@
+// # Acknowledgments. Agradecimentos.
+// NBR 14724:2024 4.2.1.6
+
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/page.typ": not_number_page, should_consider_only_odd_pages
+
+#let include_acknowledgments_page(
+ body,
+) = context {
+ not_number_page(
+ not_start_on_new_page()[
+ #page()[
+ #heading(
+ numbering: none,
+ outlined: false,
+ )[
+ Agradecimentos
+ ]
+ #body
+ ]
+
+ #if not should_consider_only_odd_pages.get() {
+ pagebreak(weak: true, to: "odd")
+ }
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/approval_page.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/approval_page.typ
new file mode 100644
index 0000000000..cc39449522
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/approval_page.typ
@@ -0,0 +1,228 @@
+// # Approval page. Folha de aprovação.
+// NBR 14724:2024 4.2.1.3, NBR 14724:2024 5.2.4
+
+#import "../../../common/components/title.typ": print_title
+#import "../../../common/style/style.typ": (
+ font_size_for_larger_text, font_size_for_smaller_text, leading_for_larger_text, simple_leading_for_smaller_text,
+ simple_spacing_for_smaller_text, spacing_for_larger_text,
+)
+#import "../../../common/components/font_family.typ": font_family_for_highlighted_text_state
+#import "../../../common/components/gender.typ": get_gender_ending
+#import "../../../common/template.typ": should_use_larger_text_to_highlight_state
+#import "../../components/examiner.typ": print_examiner
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/nature.typ": print_nature
+#import "../../components/page.typ": not_number_page, should_consider_only_odd_pages
+#import "../../components/people.typ": print_people
+#import "../../components/advisors.typ": get_advisor_role
+
+#let include_approval_page(
+ authors: {
+ (
+ (
+ first_name: "Fulano",
+ middle_name: none,
+ last_name: "Fonseca",
+ gender: "m",
+ ),
+ )
+ },
+ title: { "Título do trabalho" },
+ subtitle: {
+ // "Subtítulo do trabalho"
+ },
+ volume_number: {
+ // "1"
+ },
+ organization: {
+ (
+ name: "Nome da organização",
+ gender: "m",
+ )
+ },
+ program: {
+ // (
+ // name: "Nome do programa",
+ // gender: "m",
+ // )
+ },
+ type_of_work: {
+ (
+ name: "trabalho de conclusão de curso",
+ gender: "m",
+ )
+ },
+ degree: {
+ // (
+ // name: "bacharelado",
+ // title: (
+ // masculine: "bacharel",
+ // feminine: "bacharela",
+ // ),
+ // )
+ },
+ degree_topic: { "Tema do trabalho" },
+ area_of_concentration: {
+ // "Área de concentração"
+ },
+ advisors: {
+ (
+ (
+ first_name: "Ciclana",
+ middle_name: "de",
+ last_name: "Castro",
+ gender: "f",
+ prefix: {
+ // "Profª Drª"
+ },
+ organization: (
+ name: "Nome da organização",
+ gender: "f",
+ ),
+ ),
+ )
+ },
+ examination_committee: {
+ (
+ (
+ first_name: "Beltrano",
+ middle_name: none,
+ last_name: "Borges",
+ gender: "m",
+ prefix: {
+ "Prof. Dr."
+ },
+ organization: (
+ name: "Nome da organização",
+ gender: "f",
+ ),
+ ),
+ )
+ },
+ address: { "Local" },
+ year: { "Ano" },
+ custom_nature: {
+ "Natureza do trabalho."
+ },
+ approval_date: {
+ (
+ day: [dia],
+ month: [mês por extenso],
+ year: [ano],
+ )
+ },
+) = context {
+ not_number_page(
+ not_start_on_new_page()[
+ #page()[
+ // Approval page should not have title or numbering.
+ #set align(center)
+ #set text(
+ font: font_family_for_highlighted_text_state.get(),
+ )
+
+ // Authors
+ #strong[
+ #print_people(
+ people: authors,
+ )
+ ]
+
+ #v(0.25fr)
+
+ // Title
+ #print_title(
+ title: title,
+ subtitle: subtitle,
+ with_weight: true,
+ )
+
+ #if volume_number != none [
+ Volume #volume_number
+ #parbreak()
+ ]
+
+ #v(0.25fr)
+
+ #align(end)[
+ #box(width: 50%)[
+ #set align(start)
+ #set text(
+ size: font_size_for_smaller_text,
+ )
+ #set par(
+ leading: simple_leading_for_smaller_text,
+ spacing: simple_spacing_for_smaller_text,
+ )
+ #if custom_nature != none [
+ #custom_nature
+ ] else [
+ #print_nature(
+ authors: authors,
+ organization: organization,
+ program: program,
+ type_of_work: type_of_work,
+ degree: degree,
+ degree_topic: degree_topic,
+ area_of_concentration: area_of_concentration,
+ )
+ ]
+ ]
+ ]
+
+ #v(0.25fr)
+
+ #align(start)[
+ #set par(first-line-indent: 0pt)
+ Aprovad#get_gender_ending(type_of_work.gender) em
+ #approval_date.day
+ de #approval_date.month
+ de #approval_date.year
+ ]
+
+ #v(0.25fr)
+
+ // Examination committee
+ #[
+ #set text(weight: "bold")
+ #let content = [Banca examinadora]
+
+ #let should_use_larger_text_to_highlight = should_use_larger_text_to_highlight_state.get()
+
+ #if should_use_larger_text_to_highlight {
+ set par(
+ leading: leading_for_larger_text,
+ spacing: spacing_for_larger_text,
+ )
+ text(
+ size: font_size_for_larger_text,
+ content,
+ )
+ } else {
+ upper(content)
+ }
+
+ ]
+
+ #let is_first_advisor = true
+ #for advisor in advisors {
+ print_examiner(examiner: advisor, role: get_advisor_role(
+ gender: advisor.gender,
+ is_co_advisor: not is_first_advisor,
+ ))
+ is_first_advisor = false
+ }
+ #for examiner in examination_committee {
+ print_examiner(
+ examiner: examiner,
+ role: none,
+ )
+ }
+ ]
+
+ #if not should_consider_only_odd_pages.get() {
+ pagebreak(weak: true, to: "odd")
+ }
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/cataloging_in_publication.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/cataloging_in_publication.typ
new file mode 100644
index 0000000000..2538fbf77f
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/cataloging_in_publication.typ
@@ -0,0 +1,237 @@
+// # Cataloging-in-publication. Ficha catalográfica.
+// NBR 14724:2024 4.2.1.1.2.
+
+#import "../../../common/components/title.typ": print_title
+#import "../../../common/style/style.typ": font_size_for_smaller_text, simple_leading_for_smaller_text
+#import "../../../common/components/font_family.typ": font_family_for_highlighted_text_state
+#import "../../../common/components/text.typ": capitalize_first_letter
+#import "../../components/advisors.typ": get_advisor_role
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/page.typ": (
+ not_count_page, not_number_page, quantity_of_counted_pages, should_consider_only_odd_pages,
+)
+#import "../../components/people.typ": print_people, print_person
+
+#let parameters = (
+ authors: {
+ (
+ (
+ first_name: "Fulano",
+ middle_name: none,
+ last_name: "Fonseca",
+ gender: "m",
+ ),
+ )
+ },
+ title: { "Título do trabalho" },
+ subtitle: {
+ // "Subtítulo do trabalho"
+ },
+ volume_number: {
+ // "1"
+ },
+ address: { "Local" },
+ year: { "Ano" },
+ advisors: {
+ (
+ (
+ first_name: "Ciclana",
+ middle_name: "de",
+ last_name: "Castro",
+ gender: "f",
+ ),
+ )
+ },
+ type_of_work: {
+ (
+ name: "trabalho de conclusão de curso",
+ gender: "m",
+ )
+ },
+ degree: {
+ (
+ name: "bacharelado",
+ title: (
+ masculine: "bacharel",
+ feminine: "bacharela",
+ ),
+ )
+ },
+ organization: {
+ (
+ name: "Nome da organização",
+ gender: "m",
+ )
+ },
+ institution: {
+ // (
+ // name: "Nome da instituição",
+ // gender: "m",
+ // )
+ },
+ program: {
+ // (
+ // name: "Nome do programa",
+ // gender: "m",
+ // )
+ },
+ keywords_in_main_language: {
+ (
+ "primeira palavra-chave",
+ "segunda palavra-chave",
+ "terceira palavra-chave",
+ )
+ },
+)
+
+#let page_definitions(
+ authors: parameters.authors,
+ title: parameters.title,
+ subtitle: parameters.subtitle,
+ volume_number: parameters.volume_number,
+ address: parameters.address,
+ year: parameters.year,
+ advisors: parameters.advisors,
+ type_of_work: parameters.type_of_work,
+ degree: parameters.degree,
+ organization: parameters.organization,
+ institution: parameters.institution,
+ program: parameters.program,
+ keywords_in_main_language: parameters.keywords_in_main_language,
+) = page()[
+ #set align(center + bottom)
+ #set text(
+ font: font_family_for_highlighted_text_state.get(),
+ size: font_size_for_smaller_text,
+ )
+ #set par(first-line-indent: 0.5cm, leading: simple_leading_for_smaller_text, spacing: simple_leading_for_smaller_text)
+
+ #box(
+ stroke: (thickness: auto),
+ width: 14.5cm,
+ height: 10.2cm,
+ inset: (
+ x: 1.1cm,
+ y: 0.5cm,
+ ),
+ )[
+ #set align(start + horizon)
+
+ #print_person(person: authors.at(0), last_name_first: true).
+ #parbreak()
+
+ #print_title(title: title, subtitle: subtitle, with_weight: false)
+ #sym.slash
+ #print_people(people: authors).
+ #sym.dash.en
+ #if volume_number != none { "v. " + volume_number + sym.space + sym.dash.en }
+ #address,
+ #year.
+
+ #context { quantity_of_counted_pages.final() }
+ #if should_consider_only_odd_pages.get() [f.] else [p.]
+ #if (counter(figure.where(kind: image)).final().first() > 0) [: il.]
+ #parbreak()#linebreak()
+
+ #let is_first_advisor = true
+ #for advisor in advisors {
+ [
+ #capitalize_first_letter(get_advisor_role(gender: advisor.gender, is_co_advisor: not is_first_advisor)):
+ #print_person(person: advisor)
+ #parbreak()
+ ]
+ is_first_advisor = false
+ }
+
+ #if (
+ type_of_work.name == "trabalho de conclusão de curso"
+ ) [Trabalho de Conclusão de Curso] else [#capitalize_first_letter(type_of_work.name)]
+ (#degree.name)
+ #sym.dash.en
+ #organization.name#if institution != none { [, #institution.name] }.
+ #if program != none { [#program.name,] }
+ #if volume_number != none { "v. " + volume_number + sym.comma }
+ #year.
+ #parbreak()#linebreak()
+
+ #let keywords_counter = 1
+ #for keyword in keywords_in_main_language {
+ numbering("1. ", keywords_counter)
+ [#capitalize_first_letter(keyword). ]
+ keywords_counter += 1
+ }
+ #let notes_counter = 1
+ #for advisor in advisors {
+ numbering("I. ", notes_counter)
+ [#print_person(person: advisor, last_name_first: true),
+ #if notes_counter > 1 { "co" }orient.
+ ]
+ notes_counter += 1
+ }
+ #if institution != none {
+ numbering("I. ", notes_counter)
+ [#institution.name.]
+ notes_counter += 1
+ }
+ #{
+ numbering("I. ", notes_counter)
+ [Título.]
+ }
+ ]
+]
+
+#let include_cataloging_in_publication(
+ authors: parameters.authors,
+ title: parameters.title,
+ subtitle: parameters.subtitle,
+ volume_number: parameters.volume_number,
+ address: parameters.address,
+ year: parameters.year,
+ advisors: parameters.advisors,
+ type_of_work: parameters.type_of_work,
+ degree: parameters.degree,
+ organization: parameters.organization,
+ institution: parameters.institution,
+ program: parameters.program,
+ keywords_in_main_language: parameters.keywords_in_main_language,
+) = context {
+ not_number_page(
+ not_start_on_new_page()[
+ #if should_consider_only_odd_pages.get() {
+ not_count_page(
+ page_definitions(
+ authors: authors,
+ title: title,
+ subtitle: subtitle,
+ volume_number: volume_number,
+ address: address,
+ year: year,
+ advisors: advisors,
+ type_of_work: type_of_work,
+ degree: degree,
+ organization: organization,
+ institution: institution,
+ program: program,
+ keywords_in_main_language: keywords_in_main_language,
+ ),
+ )
+ } else {
+ page_definitions(
+ authors: authors,
+ title: title,
+ subtitle: subtitle,
+ volume_number: volume_number,
+ address: address,
+ year: year,
+ advisors: advisors,
+ type_of_work: type_of_work,
+ degree: degree,
+ organization: organization,
+ institution: institution,
+ program: program,
+ keywords_in_main_language: keywords_in_main_language,
+ )
+ }
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/custom_cataloging_in_publication.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/custom_cataloging_in_publication.typ
new file mode 100644
index 0000000000..9f72bd1058
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/custom_cataloging_in_publication.typ
@@ -0,0 +1,28 @@
+// # Custom cataloging-in-publication. Ficha catalográfica customizada.
+// NBR 14724:2024 4.2.1.1.2
+
+#import "../../../common/components/font_family.typ": font_family_for_highlighted_text_state
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/page.typ": not_count_page, not_number_page, should_consider_only_odd_pages
+
+#let include_custom_cataloging_in_publication(
+ body,
+) = context {
+ set page(
+ margin: 0cm,
+ )
+ set text(
+ font: font_family_for_highlighted_text_state.get(),
+ )
+ not_number_page(
+ not_start_on_new_page()[
+ #if should_consider_only_odd_pages.get() {
+ not_count_page(
+ body,
+ )
+ } else {
+ body
+ }
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/dedication.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/dedication.typ
new file mode 100644
index 0000000000..dbfea0f5be
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/dedication.typ
@@ -0,0 +1,28 @@
+// # Dedication. Dedicatória.
+// NBR 14724:2024 4.2.1.4, NBR 14724:2024 5.2.4
+
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/page.typ": not_number_page, should_consider_only_odd_pages
+
+#let include_dedication_page(
+ body,
+) = context {
+ not_number_page(
+ not_start_on_new_page()[
+ #page()[
+ // Dedication should not have title or numbering.
+ // Dedication should start from the middle of the page to the right, and aligned to the bottom.
+ #align(end + bottom)[
+ #box(width: 50%)[
+ #set align(start)
+ #body
+ ]
+ ]
+ ]
+
+ #if not should_consider_only_odd_pages.get() {
+ pagebreak(weak: true, to: "odd")
+ }
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/epigraph.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/epigraph.typ
new file mode 100644
index 0000000000..46d7ce8622
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/epigraph.typ
@@ -0,0 +1,34 @@
+// # Epigraph. Epígrafe.
+// NBR 14724:2024 4.2.1.6
+
+#import "../../components/epigraph.typ": include_epigraph
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/page.typ": not_number_page, should_consider_only_odd_pages
+
+// NBR 14724:2024 4.2.1.6, NBR 14724:2024 5.2.4, NBR 14724:2024 5.5
+// Epigraph on pre-textual elements can present a quote without following long quote formatting, as determined by NBR 14724:2024 4.2.1.6.
+#let include_epigraph_page(
+ indent: true,
+ smaller_text: true,
+ body,
+) = context {
+ not_number_page(
+ not_start_on_new_page()[
+ #page(
+ // Epigraph should not have title or numbering.
+ // Epigraph should be aligned to the bottom.
+ align(bottom, {
+ include_epigraph(
+ indent: indent,
+ smaller_text: smaller_text,
+ body,
+ )
+ }),
+ )
+
+ #if not should_consider_only_odd_pages.get() {
+ pagebreak(weak: true, to: "odd")
+ }
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/errata.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/errata.typ
new file mode 100644
index 0000000000..27c680d832
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/errata.typ
@@ -0,0 +1,27 @@
+// # Errata. Errata.
+// NBR 14724:2024 4.2.1.2
+
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/page.typ": not_number_page, should_consider_only_odd_pages
+
+#let include_errata_page(
+ body,
+) = context {
+ not_number_page(
+ not_start_on_new_page()[
+ #page()[
+ #heading(
+ numbering: none,
+ outlined: false,
+ )[
+ Errata
+ ]
+ #body
+ ]
+
+ #if not should_consider_only_odd_pages.get() {
+ pagebreak(weak: true, to: "odd")
+ }
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/list_of_abbreviations.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/list_of_abbreviations.typ
new file mode 100644
index 0000000000..74bcb81b8e
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/list_of_abbreviations.typ
@@ -0,0 +1,22 @@
+// # List of abbreviations. Lista de abreviaturas e siglas.
+// NBR 14724:2024 4.2.1.11
+
+#import "../../components/entry_on_simple_glossary_lists.typ": print_gloss
+#import "../../components/page.typ": not_number_page
+#import "../post_textual/glossary.typ": include_glossary_page
+
+#let include_list_of_abbreviations_page(
+ invisible: false,
+ abbreviations_entries,
+) = {
+ not_number_page(
+ include_glossary_page(
+ disable_back_references: true,
+ invisible: invisible,
+ print_gloss: print_gloss,
+ title: "Lista de abreviaturas e siglas",
+ outlined: false,
+ abbreviations_entries,
+ ),
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/list_of_figures.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/list_of_figures.typ
new file mode 100644
index 0000000000..9fdc58f17c
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/list_of_figures.typ
@@ -0,0 +1,20 @@
+// # List of figures. Lista de ilustrações.
+// NBR 14724:2024 4.2.1.9
+
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/list_of_figures.typ": include_list_of_figures
+#import "../../components/page.typ": not_number_page, should_consider_only_odd_pages
+
+#let include_list_of_figures_page() = context {
+ not_number_page(
+ not_start_on_new_page()[
+ #page()[
+ #include_list_of_figures()
+ ]
+
+ #if not should_consider_only_odd_pages.get() {
+ pagebreak(weak: true, to: "odd")
+ }
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/list_of_symbols.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/list_of_symbols.typ
new file mode 100644
index 0000000000..ca8ce4d344
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/list_of_symbols.typ
@@ -0,0 +1,22 @@
+// # List of symbols. Lista de símbolos.
+// NBR 14724:2024 4.2.1.12
+
+#import "../../components/entry_on_simple_glossary_lists.typ": print_gloss
+#import "../../components/page.typ": not_number_page
+#import "../post_textual/glossary.typ": include_glossary_page
+
+#let include_list_of_symbols_page(
+ invisible: false,
+ symbols_entries,
+) = {
+ not_number_page(
+ include_glossary_page(
+ disable_back_references: true,
+ invisible: invisible,
+ print_gloss: print_gloss,
+ title: "Lista de símbolos",
+ outlined: false,
+ symbols_entries,
+ ),
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/list_of_tables.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/list_of_tables.typ
new file mode 100644
index 0000000000..bde68d27d0
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/list_of_tables.typ
@@ -0,0 +1,20 @@
+// # List of tables. Lista de tabelas.
+// NBR 14724:2024 4.2.1.10
+
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/list_of_tables.typ": include_list_of_tables
+#import "../../components/page.typ": not_number_page, should_consider_only_odd_pages
+
+#let include_list_of_tables_page() = context {
+ not_number_page(
+ not_start_on_new_page()[
+ #page()[
+ #include_list_of_tables()
+ ]
+
+ #if not should_consider_only_odd_pages.get() {
+ pagebreak(weak: true, to: "odd")
+ }
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/outline.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/outline.typ
new file mode 100644
index 0000000000..afba3bf777
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/outline.typ
@@ -0,0 +1,92 @@
+// # Outline. Sumário.
+// NBR 6027:2012, NBR 14724:2024 4.2.1.13
+
+#import "../../../common/components/font_family.typ": font_family_for_highlighted_text_state
+#import "../../../common/components/heading.typ": capitalize_or_underline_if_needed, get_styling_for_heading
+#import "../../../common/template.typ": should_use_larger_text_to_highlight_state
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/page.typ": not_number_page, should_consider_only_odd_pages
+
+#let include_outline_page() = context {
+ let font_family_for_highlighted_text = font_family_for_highlighted_text_state.get()
+
+ set text(
+ font: font_family_for_highlighted_text,
+ )
+
+ not_number_page(
+ not_start_on_new_page()[
+ #page()[
+ #show outline.entry: it => {
+ let (
+ font_size,
+ leading,
+ spacing,
+ should_capitalize,
+ font_weight,
+ text_style,
+ should_underline,
+ ) = get_styling_for_heading(
+ should_use_larger_text_to_highlight: should_use_larger_text_to_highlight_state.get(),
+ it,
+ )
+
+ set text(
+ font: font_family_for_highlighted_text,
+ size: font_size,
+ weight: font_weight,
+ style: text_style,
+ )
+
+ set par(
+ leading: leading,
+ spacing: spacing,
+ first-line-indent: 0cm,
+ )
+
+ let prefix = it.prefix()
+ if it.element.supplement == [Apêndice] {
+ prefix = [Apêndice #prefix #sym.dash.em]
+ }
+ if it.element.supplement == [Anexo] {
+ prefix = [Anexo #prefix #sym.dash.em]
+ }
+ prefix = capitalize_or_underline_if_needed(
+ should_capitalize: should_capitalize,
+ should_underline: should_underline,
+ prefix,
+ )
+
+ let inner = capitalize_or_underline_if_needed(
+ should_capitalize: should_capitalize,
+ should_underline: should_underline,
+ it.inner(),
+ )
+
+ // NBR 14724:2024 5.2.2.
+ // Headings must have a blank space of 1.5 above and below.
+ block(
+ below: spacing * 2,
+ )[
+ #link(
+ it.element.location(),
+ it.indented(
+ [#prefix],
+ inner,
+ ),
+ )
+ ]
+ }
+
+ #outline(
+ depth: 5,
+ indent: 0cm,
+ )
+ ]
+
+ #if not should_consider_only_odd_pages.get() {
+ pagebreak(weak: true, to: "odd")
+ }
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/title_page.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/title_page.typ
new file mode 100644
index 0000000000..e692c70163
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/pages/pre_textual/title_page.typ
@@ -0,0 +1,146 @@
+// # Title page. Folha de rosto.
+// NBR 14724:2024 4.2.1.1.1
+
+#import "../../../common/components/title.typ": print_title
+#import "../../../common/style/style.typ": (
+ font_size_for_smaller_text, simple_leading_for_smaller_text, simple_spacing_for_smaller_text,
+)
+#import "../../../common/components/font_family.typ": font_family_for_highlighted_text_state
+#import "../../components/advisors.typ": print_advisors
+#import "../../components/heading.typ": not_start_on_new_page
+#import "../../components/nature.typ": print_nature
+#import "../../components/page.typ": not_number_page
+#import "../../components/people.typ": print_people
+
+#let include_title_page(
+ authors: {
+ (
+ (
+ first_name: "Fulano",
+ middle_name: none,
+ last_name: "Fonseca",
+ gender: "m",
+ ),
+ )
+ },
+ title: { "Título do trabalho" },
+ subtitle: {
+ // "Subtítulo do trabalho"
+ },
+ volume_number: {
+ // "1"
+ },
+ organization: {
+ (
+ name: "Nome da organização",
+ gender: "m",
+ )
+ },
+ program: {
+ // (
+ // name: "Nome do programa",
+ // gender: "m",
+ // )
+ },
+ type_of_work: {
+ // (
+ // name: "trabalho de conclusão de curso",
+ // gender: "m",
+ // )
+ },
+ degree: {
+ // (
+ // name: "bacharelado",
+ // title: (
+ // masculine: "bacharel",
+ // feminine: "bacharela",
+ // ),
+ // )
+ },
+ degree_topic: { "Tema do trabalho" },
+ area_of_concentration: {
+ // "Área de concentração"
+ },
+ advisors: {
+ (
+ (
+ first_name: "Ciclana",
+ middle_name: "de",
+ last_name: "Castro",
+ gender: "f",
+ prefix: {
+ // "Profª Drª"
+ },
+ ),
+ )
+ },
+ address: { "Local" },
+ year: { "Ano" },
+ custom_nature: {
+ "Natureza do trabalho."
+ },
+) = context {
+ not_number_page(
+ not_start_on_new_page()[
+ #page()[
+ #set align(center)
+ #set text(
+ font: font_family_for_highlighted_text_state.get(),
+ )
+
+ // Authors
+ #strong[
+ #print_people(people: authors)
+ ]
+
+ #v(1fr)
+
+ // Title
+ #print_title(title: title, subtitle: subtitle, with_weight: true)
+
+ #if volume_number != none [
+ Volume #volume_number
+ #parbreak()
+ ]
+
+ #v(1fr)
+
+ #align(end)[
+ #box(width: 50%)[
+ #set align(start)
+ #set text(size: font_size_for_smaller_text)
+ #set par(leading: simple_leading_for_smaller_text, spacing: simple_spacing_for_smaller_text)
+ #if custom_nature != none [
+ #custom_nature
+ ] else [
+ #print_nature(
+ authors: authors,
+ organization: organization,
+ program: program,
+ type_of_work: type_of_work,
+ degree: degree,
+ degree_topic: degree_topic,
+ area_of_concentration: area_of_concentration,
+ )
+ ]
+ ]
+ ]
+
+ #v(1fr)
+
+ // Advisors
+ #align(start)[
+ #set par(first-line-indent: 0pt)
+ #print_advisors(advisors: advisors)
+ ]
+
+ #v(1fr)
+
+ // Publishing information
+ #address
+ #linebreak()
+ #year
+ ]
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/academic_work/template.typ b/packages/preview/quati-abnt/0.1.0/src/academic_work/template.typ
new file mode 100644
index 0000000000..3340e0abf2
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/academic_work/template.typ
@@ -0,0 +1,87 @@
+#import "../common/style/style.typ": margin_bottom, margin_end, margin_start, margin_top, paper_size
+#import "../common/template.typ": template as common_template
+#import "../common/components/font_family.typ": font_family_math, font_family_mono, font_family_sans, font_family_serif
+#import "./components/heading.typ": format_heading
+#import "./components/page.typ": format_header, should_consider_only_odd_pages as should_consider_only_odd_pages_state
+
+#let template(
+ doc,
+ //
+ // Color to format links.
+ color_of_links: none,
+ //
+ // Font families.
+ font_family_for_common_text: font_family_serif,
+ font_family_for_highlighted_text: font_family_sans,
+ font_family_for_math_text: font_family_math,
+ font_family_for_monospaced_text: font_family_mono,
+ font_family_for_editor_notes: font_family_sans,
+ //
+ // Whether to use uppercase as typographic highlight.
+ should_use_larger_text_to_highlight: false,
+ //
+ // Whether to print content on the back of pages.
+ should_consider_only_odd_pages: true,
+ //
+ // Whether to number pages and print its number on the header.
+ should_number_pages: false,
+ //
+ // Whether to display editor notes.
+ should_display_editor_notes: true,
+) = {
+ should_consider_only_odd_pages_state.update(should_consider_only_odd_pages)
+
+ // ## Page. Página.
+ // NBR 14724:2024 5.1
+ // When the document is printed double-sided, the inner margin should be larger than the outer margin
+ let margin = if should_consider_only_odd_pages {
+ (
+ top: margin_top,
+ right: margin_end,
+ bottom: margin_bottom,
+ left: margin_start,
+ )
+ } else {
+ (
+ top: margin_top,
+ outside: margin_end,
+ bottom: margin_bottom,
+ inside: margin_start,
+ )
+ }
+ set page(
+ paper: paper_size,
+ margin: margin,
+ header: format_header(
+ should_number_pages: should_number_pages,
+ ),
+ )
+
+ // ## Headings. Títulos.
+ // NBR 14724:2024.
+ show heading: set heading(
+ supplement: "Subseção",
+ )
+ show heading.where(level: 1): set heading(supplement: "Capítulo")
+ show heading.where(level: 2): set heading(supplement: "Seção")
+
+ // ### Format. Formatação.
+ show heading: it => {
+ format_heading(
+ should_use_larger_text_to_highlight: should_use_larger_text_to_highlight,
+ it,
+ )
+ }
+
+ common_template(
+ doc,
+ color_of_links: color_of_links,
+ font_family_for_common_text: font_family_for_common_text,
+ font_family_for_highlighted_text: font_family_for_highlighted_text,
+ font_family_for_math_text: font_family_for_math_text,
+ font_family_for_monospaced_text: font_family_for_monospaced_text,
+ font_family_for_editor_notes: font_family_for_editor_notes,
+ should_use_larger_text_to_highlight: should_use_larger_text_to_highlight,
+ should_display_editor_notes: should_display_editor_notes,
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/article/components/abstract.typ b/packages/preview/quati-abnt/0.1.0/src/article/components/abstract.typ
new file mode 100644
index 0000000000..0a602622cb
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/article/components/abstract.typ
@@ -0,0 +1,26 @@
+// # Abstract. Resumo.
+
+#import "../../common/components/abstract.typ": include_abstract
+#import "../../common/style/style.typ": leading_for_common_text
+
+#let include_abstracts = (
+ abstracts: (
+ (
+ keywords_title: { "Palavras-chave" },
+ keywords: {
+ (
+ "primeira palavra-chave",
+ "segunda palavra-chave",
+ "terceira palavra-chave",
+ )
+ },
+ title: { "Resumo" },
+ body: { "Conteúdo do resumo." },
+ ),
+ ),
+) => {
+ for abstract in abstracts {
+ include_abstract(..abstract)
+ v(leading_for_common_text * 2)
+ }
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/article/components/acknowledgements.typ b/packages/preview/quati-abnt/0.1.0/src/article/components/acknowledgements.typ
new file mode 100644
index 0000000000..e3bac3815d
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/article/components/acknowledgements.typ
@@ -0,0 +1,13 @@
+// # Acknowledgments. Agradecimentos.
+// NBR 6022:2018 5.3.5
+
+#let include_acknowledgements = body => {
+ [
+ #heading(
+ numbering: none,
+ )[
+ Agradecimentos
+ ]
+ #body
+ ]
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/article/components/main.typ b/packages/preview/quati-abnt/0.1.0/src/article/components/main.typ
new file mode 100644
index 0000000000..a8a3336d17
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/article/components/main.typ
@@ -0,0 +1,6 @@
+// # Components. Componentes.
+
+#import "abstract.typ": include_abstracts
+#import "acknowledgements.typ": include_acknowledgements
+#import "opening.typ": include_opening
+#import "people.typ": print_people, print_person
diff --git a/packages/preview/quati-abnt/0.1.0/src/article/components/opening.typ b/packages/preview/quati-abnt/0.1.0/src/article/components/opening.typ
new file mode 100644
index 0000000000..21cb3d724f
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/article/components/opening.typ
@@ -0,0 +1,84 @@
+// # Opening. Abertura.
+// NBR 6022:2018 5.1
+
+#import "../../common/components/title.typ": print_title
+#import "../../common/style/style.typ": (
+ font_size_for_common_text, font_size_for_larger_text, leading_for_common_text, leading_for_larger_text,
+ spacing_for_common_text, spacing_for_larger_text,
+)
+#import "../../common/template.typ": should_use_larger_text_to_highlight_state
+#import "../../common/components/font_family.typ": (
+ font_family_for_common_text_state, font_family_for_highlighted_text_state,
+)
+#import "./people.typ": print_people
+
+#let include_opening = (
+ authors: {
+ (
+ (
+ first_name: "Fulano",
+ middle_name: none,
+ last_name: "Fonseca",
+ curriculum: [E-mail: #link("mailto:fulano@email.com").],
+ ),
+ )
+ },
+ title: { "Título do trabalho" },
+ title_in_foreign_language: {
+ none
+ },
+ subtitle: {
+ // "Subtítulo do trabalho"
+ },
+) => context {
+ set text(
+ font: font_family_for_highlighted_text_state.get(),
+ )
+ set par(
+ first-line-indent: 0pt,
+ )
+
+ align(center)[
+ #let should_use_larger_text_to_highlight = should_use_larger_text_to_highlight_state.get()
+
+ #let size = font_size_for_common_text
+ #let leading = leading_for_common_text
+ #let spacing = spacing_for_common_text
+
+ #if should_use_larger_text_to_highlight {
+ size = font_size_for_larger_text
+ leading = leading_for_larger_text
+ spacing = spacing_for_common_text
+ }
+
+ #set text(
+ size: size,
+ )
+ #set par(
+ leading: leading,
+ spacing: spacing,
+ )
+
+ // ## Title. Título.
+ #print_title(
+ title: title,
+ subtitle: subtitle,
+ )
+ #parbreak()
+
+ // ## Title in foreign language. Título em língua estrangeira.
+ #if title_in_foreign_language != none [
+ #title_in_foreign_language
+ #parbreak()
+ ]
+
+ #v(spacing_for_common_text)
+ ]
+
+ align(right)[
+ #print_people(people: authors)
+ ]
+ parbreak()
+
+ counter(footnote).update(0)
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/article/components/people.typ b/packages/preview/quati-abnt/0.1.0/src/article/components/people.typ
new file mode 100644
index 0000000000..e4257ac6b9
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/article/components/people.typ
@@ -0,0 +1,41 @@
+// # People. Pessoas.
+
+#import "../../common/components/font_family.typ": font_family_for_common_text_state
+
+#let print_person(
+ person: (
+ first_name: "Fulano",
+ middle_name: none,
+ last_name: "Fonseca",
+ curriculum: [E-mail: #link("mailto:fulano@email.com").],
+ ),
+) = context {
+ person.first_name
+ if person.middle_name != none {
+ sym.space + person.middle_name
+ }
+ sym.space
+ person.last_name
+ text(
+ font: font_family_for_common_text_state.get(),
+ footnote(
+ numbering: "*",
+ person.curriculum,
+ ),
+ )
+}
+
+#let print_people(
+ people: (),
+ joiner: linebreak(),
+) = {
+ (
+ people
+ .map(person => print_person(
+ person: person,
+ ))
+ .join(
+ joiner,
+ )
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/article/main.typ b/packages/preview/quati-abnt/0.1.0/src/article/main.typ
new file mode 100644
index 0000000000..e22652d674
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/article/main.typ
@@ -0,0 +1,4 @@
+// # Article. Artigo.
+
+#import "./components/main.typ" as components
+#import "./template.typ": template
diff --git a/packages/preview/quati-abnt/0.1.0/src/article/template.typ b/packages/preview/quati-abnt/0.1.0/src/article/template.typ
new file mode 100644
index 0000000000..32b32ffce4
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/article/template.typ
@@ -0,0 +1,70 @@
+#import "../common/components/heading.typ": format_heading
+#import "../common/style/style.typ": margin_bottom, margin_end, margin_start, margin_top
+#import "../common/template.typ": template as common_template
+#import "../common/components/font_family.typ": font_family_math, font_family_mono, font_family_sans, font_family_serif
+
+#let template(
+ doc,
+ //
+ // Color to format links.
+ color_of_links: none,
+ //
+ // Font families.
+ font_family_for_common_text: font_family_serif,
+ font_family_for_highlighted_text: font_family_sans,
+ font_family_for_math_text: font_family_math,
+ font_family_for_monospaced_text: font_family_mono,
+ font_family_for_editor_notes: font_family_sans,
+ //
+ // Whether to use uppercase as typographic highlight.
+ should_use_larger_text_to_highlight: false,
+ //
+ // Whether to number pages and print its number on the header.
+ should_number_pages: true,
+ //
+ // Whether to display editor notes.
+ should_display_editor_notes: true,
+) = {
+ // ## Page. Página.
+ set page(
+ margin: (
+ top: margin_top,
+ right: margin_end,
+ bottom: margin_bottom,
+ left: margin_start,
+ ),
+ numbering: if should_number_pages { "1" } else { none },
+ number-align: top + end,
+ )
+
+ // ## Headings. Títulos.
+ // NBR 6024:2012.
+ show heading: set heading(
+ supplement: "Subseção",
+ )
+ show heading.where(
+ level: 1,
+ ): set heading(
+ supplement: "Seção",
+ )
+
+ // ### Format. Formatação.
+ show heading: it => {
+ format_heading(
+ should_use_larger_text_to_highlight: should_use_larger_text_to_highlight,
+ it,
+ )
+ }
+
+ common_template(
+ doc,
+ color_of_links: color_of_links,
+ font_family_for_common_text: font_family_for_common_text,
+ font_family_for_highlighted_text: font_family_for_highlighted_text,
+ font_family_for_math_text: font_family_for_math_text,
+ font_family_for_monospaced_text: font_family_for_monospaced_text,
+ font_family_for_editor_notes: font_family_for_editor_notes,
+ should_use_larger_text_to_highlight: should_use_larger_text_to_highlight,
+ should_display_editor_notes: should_display_editor_notes,
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/abstract.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/abstract.typ
new file mode 100644
index 0000000000..4d304cbbc9
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/abstract.typ
@@ -0,0 +1,42 @@
+// # Abstract. Resumo.
+// NBR 14724:2024 4.2.1.7, NBR 14724:2024 4.2.1.8
+
+#import "../style/style.typ": leading_for_common_text
+
+#let include_abstract = (
+ keywords_title: { "Palavras-chave" },
+ keywords: {
+ (
+ "primeira palavra-chave",
+ "segunda palavra-chave",
+ "terceira palavra-chave",
+ )
+ },
+ title: { "Resumo" },
+ body: { "Conteúdo do resumo." },
+) => {
+ [
+ #heading(
+ numbering: none,
+ outlined: false,
+ )[
+ #title
+ ]
+
+ #align(left)[
+ #body
+ #v(leading_for_common_text)
+
+ // NBR 6028:2021
+ // Keywords are preceded by a title and colon.
+ // Keywords are separated by semicolons and end with a period.
+ // Keywords are not capitalized.
+ #par(
+ first-line-indent: 0cm,
+ )[
+ #text(weight: "bold")[#keywords_title:]
+ #keywords.join("; ").
+ ]
+ ]
+ ]
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/annex.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/annex.typ
new file mode 100644
index 0000000000..42d6246f18
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/annex.typ
@@ -0,0 +1,17 @@
+// # Annex. Anexo.
+// NBR 14724:2024 4.2.3.4
+
+#let include_annex(
+ title: "",
+ label: none,
+ body,
+) = {
+ // Annexes must be numbered with letters
+ set heading(numbering: "A.1.1")
+
+ [
+ // When referenced, annexes must have the supplement "Anexo"
+ #heading(supplement: "Anexo", title)#label
+ #body
+ ]
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/appendix.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/appendix.typ
new file mode 100644
index 0000000000..fcf0358d9f
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/appendix.typ
@@ -0,0 +1,17 @@
+// # Appendix. Apêndice.
+// NBR 14724:2024 4.2.3.3
+
+#let include_appendix(
+ title: "",
+ label: none,
+ body,
+) = {
+ // Appendixes must be numbered with letters
+ set heading(numbering: "A.1.1")
+
+ [
+ // When referenced, appendixes must have the supplement "Apêndice"
+ #heading(supplement: "Apêndice", title)#label
+ #body
+ ]
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/bibliography.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/bibliography.typ
new file mode 100644
index 0000000000..e82470d468
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/bibliography.typ
@@ -0,0 +1,27 @@
+// # Bibliography. Referências.
+// NBR 6023:2025 6, NBR 14724:2024 4.2.3.1
+
+#import "../style/style.typ": leading_for_bibliography, spacing_for_bibliography
+
+#let format_bibliography(body) = {
+ set par(
+ leading: leading_for_bibliography,
+ spacing: spacing_for_bibliography,
+ )
+ body
+}
+
+// ## Prose citation. Citação em prosa.
+// NBR 10520:2023.
+// Esta função usa um estilo CSL dedicado que formata os autores com vírgulas e "e" antes do último (ex.: Silva, Souza e Oliveira), adequado ao corpo do texto.
+#let cite_prose(
+ supplement: none,
+ key,
+) = {
+ cite(
+ form: "prose",
+ supplement: supplement,
+ style: "../style/bibliography_style_prose.csl",
+ key,
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/editor_note.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/editor_note.typ
new file mode 100644
index 0000000000..9d79810a75
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/editor_note.typ
@@ -0,0 +1,307 @@
+// # Note. Nota.
+
+#import "../style/style.typ": simple_spacing_for_smaller_text
+#import "../components/font_family.typ": font_family_for_editor_notes_state
+
+#let should_display_editor_notes_state = state("quati_abnt_should_display_editor_notes", true)
+
+#let color_of_fill_of_notes = oklch(100%, 0, 90deg)
+#let paint_of_stroke_of_notes = oklch(80.78%, 0, 0deg)
+#let thickness_of_stroke_of_notes = 1.5pt
+
+#let handle_stroke = stroke_definition => {
+ let converted_stroke = stroke(stroke_definition)
+ let paint = converted_stroke.paint
+ let thickness = converted_stroke.thickness
+
+ if (paint == auto) {
+ paint = paint_of_stroke_of_notes
+ }
+ if (thickness == auto) {
+ thickness = thickness_of_stroke_of_notes
+ }
+
+ stroke(
+ cap: converted_stroke.cap,
+ dash: converted_stroke.dash,
+ join: converted_stroke.join,
+ miter-limit: converted_stroke.miter-limit,
+ paint: paint,
+ thickness: thickness,
+ )
+}
+
+#let stroke_of_notes = handle_stroke(
+ paint_of_stroke_of_notes + thickness_of_stroke_of_notes,
+)
+
+#let join_strokes = (
+ new_stroke: none,
+ old_stroke: stroke_of_notes,
+) => {
+ let cap = if (new_stroke.cap == none) {
+ old_stroke.cap
+ } else {
+ new_stroke.cap
+ }
+
+ let dash = if (new_stroke.dash == none) {
+ old_stroke.dash
+ } else {
+ new_stroke.dash
+ }
+
+ let join = if (new_stroke.join == none) {
+ old_stroke.join
+ } else {
+ new_stroke.join
+ }
+
+ let miter-limit = if (new_stroke.miter-limit == none) {
+ old_stroke.miter-limit
+ } else {
+ new_stroke.miter-limit
+ }
+
+ let paint = if (new_stroke.paint == none) {
+ old_stroke.paint
+ } else {
+ new_stroke.paint
+ }
+
+ let thickness = if (new_stroke.thickness == none) {
+ old_stroke.thickness
+ } else {
+ new_stroke.thickness
+ }
+
+ stroke(
+ cap: cap,
+ dash: dash,
+ join: join,
+ miter-limit: miter-limit,
+ paint: paint,
+ thickness: thickness,
+ )
+}
+
+#let box_of_prefix = (
+ fill_of_note: none,
+ prefix: (
+ body: none,
+ fill: none,
+ stroke: none,
+ ),
+) => {
+ set text(weight: "bold")
+
+ let fill_of_prefix = if (
+ prefix.keys().contains("fill")
+ ) {
+ prefix.fill
+ } else {
+ none
+ }
+ if (fill_of_prefix == none) {
+ fill_of_prefix = fill_of_note.mix(color.luma(95%))
+ }
+
+ box(
+ fill: fill_of_prefix,
+ inset: 6pt,
+ prefix.body,
+ )
+}
+
+
+#let get_stroke_of_prefix = (
+ prefix: none,
+ stroke_of_note: none,
+) => {
+ let stroke_of_prefix = if (
+ prefix.keys().contains("stroke")
+ ) {
+ prefix.stroke
+ } else {
+ none
+ }
+ if (stroke_of_prefix == none) {
+ stroke_of_prefix = join_strokes(
+ old_stroke: stroke_of_note,
+ new_stroke: stroke(
+ paint: stroke_of_note.paint,
+ ),
+ )
+ }
+ handle_stroke(stroke_of_prefix)
+}
+
+#let block_of_note(
+ fill: none,
+ prefixes: none,
+ stroke: none,
+ it,
+) = context {
+ if (should_display_editor_notes_state.get() == true) {
+ set text(
+ font: font_family_for_editor_notes_state.get(),
+ )
+ set par(first-line-indent: 0pt)
+ block(
+ breakable: false,
+ clip: true,
+ fill: fill,
+ radius: 6pt,
+ stroke: stroke,
+
+ grid(
+ rows: 2,
+
+ if (prefixes != none) {
+ // Converts a prefix dictionary into an array of a single element, in case the user has inputted the prefixes incorrectly as not an array.
+ let handled_prefixes = if (type(prefixes) == dictionary) {
+ (prefixes,)
+ } else {
+ prefixes
+ }
+
+ set par(
+ spacing: simple_spacing_for_smaller_text,
+ )
+
+ let boxes_of_prefixes = handled_prefixes.map(
+ prefix => {
+ let stroke_of_prefix = get_stroke_of_prefix(
+ prefix: prefix,
+ stroke_of_note: stroke,
+ )
+ grid.cell(
+ stroke: stroke_of_prefix,
+ inset: stroke_of_prefix.thickness / 2,
+ box_of_prefix(
+ fill_of_note: fill,
+ prefix: prefix,
+ ),
+ )
+ },
+ )
+
+ grid(
+ columns: boxes_of_prefixes.len(),
+ gutter: thickness_of_stroke_of_notes,
+ ..boxes_of_prefixes,
+ )
+ },
+
+ block(
+ inset: 6pt,
+ it,
+ ),
+ ),
+ )
+ }
+}
+
+#let editor_note = (
+ fill: color_of_fill_of_notes,
+ prefixes: none,
+ stroke: stroke_of_notes,
+ it,
+) => {
+ block_of_note(
+ fill: fill,
+ prefixes: prefixes,
+ stroke: handle_stroke(stroke),
+ it,
+ )
+}
+
+#let create_status_note = (
+ fill: color_of_fill_of_notes,
+ prefixes: none,
+ status: "NOTA",
+ stroke: stroke_of_notes,
+ it,
+) => {
+ let prefix_of_status = (body: status)
+
+ editor_note(
+ fill: fill,
+ prefixes: (
+ ..prefixes,
+ prefix_of_status,
+ ),
+ stroke: stroke,
+ it,
+ )
+}
+
+#let todo_note = (
+ prefixes: none,
+ it,
+) => {
+ let color = oklch(91.95%, 0.117, 93.14deg)
+ create_status_note(
+ fill: color,
+ prefixes: prefixes,
+ status: "AFAZER",
+ stroke: color.saturate(75%),
+ it,
+ )
+}
+
+#let progress_note = (
+ prefixes: none,
+ it,
+) => {
+ let color = oklch(90.73%, 0.142, 115.79deg)
+ create_status_note(
+ fill: color,
+ prefixes: prefixes,
+ status: "PROGRESSO",
+ stroke: color.saturate(90%).darken(5%),
+ it,
+ )
+}
+
+#let done_note = (
+ prefixes: none,
+ it,
+) => {
+ let color = oklch(85.66%, 0.082, 235.93deg)
+ create_status_note(
+ fill: color,
+ status: "FEITO",
+ prefixes: prefixes,
+ stroke: color.saturate(75%),
+ it,
+ )
+}
+
+#let open_discussion_note = (
+ prefixes: none,
+ it,
+) => {
+ let color = oklch(78.14%, 0.117, 248.13deg)
+ create_status_note(
+ fill: color,
+ status: "ABERTO",
+ prefixes: prefixes,
+ stroke: color.saturate(75%),
+ it,
+ )
+}
+
+#let closed_discussion_note = (
+ prefixes: none,
+ it,
+) => {
+ let color = oklch(78.14%, 0.05, 248.13deg)
+ create_status_note(
+ fill: color,
+ status: "FECHADO",
+ prefixes: prefixes,
+ stroke: color.saturate(25%),
+ it,
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/equation.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/equation.typ
new file mode 100644
index 0000000000..48ca84d6ec
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/equation.typ
@@ -0,0 +1,45 @@
+// # Equation. Equação.
+// NBR 14724:2024 5.7
+
+#import "../components/font_family.typ": font_family_for_math_text_state
+
+#let equation(
+ placement: none,
+ width: auto,
+ body,
+) = context {
+ set text(
+ font: font_family_for_math_text_state.get(),
+ )
+
+ let equation_block = align(
+ center,
+ block(
+ sticky: true,
+ width: width,
+ align(
+ start,
+ body,
+ ),
+ ),
+ )
+
+ if placement == none {
+ equation_block
+ } else {
+ let alignment = if (
+ placement == auto
+ ) {
+ auto
+ } else if (placement == top or placement == bottom) {
+ placement + center
+ } else {
+ panic("Placement should be one of the following options: none, auto, top, bottom.")
+ }
+ place(
+ alignment,
+ float: true,
+ equation_block,
+ )
+ }
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/figure.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/figure.typ
new file mode 100644
index 0000000000..50a6ea293c
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/figure.typ
@@ -0,0 +1,177 @@
+// # Figures. Figuras.
+// NBR 14724:2024 5.8, NBR 14724:2024 5.9
+
+#import "../style/style.typ": (
+ font_size_for_common_text, font_size_for_smaller_text, leading_for_common_text, simple_leading_for_smaller_text,
+ simple_spacing_for_smaller_text, spacing_around_figure, spacing_for_common_text,
+)
+#import "./figure_footer.typ": figure_footer
+
+#let format_caption_of_figure(
+ width: auto,
+ it,
+) = {
+ // NBR 14724:2024 5.8
+ // The caption of a figure should be in the same font size as the common text
+ set text(
+ size: font_size_for_common_text,
+ )
+ set par(
+ leading: leading_for_common_text,
+ spacing: spacing_for_common_text,
+ )
+ it
+}
+
+#let format_information_of_figure(
+ note: none,
+ source: none,
+) = context {
+ // NBR 14724:2024 5.8
+ // Source and notes should be in a smaller font size
+ set par(
+ first-line-indent: 0cm,
+ leading: simple_leading_for_smaller_text,
+ spacing: simple_spacing_for_smaller_text,
+ )
+ set text(
+ size: font_size_for_smaller_text,
+ )
+ // Source and notes should be aligned to the left
+ set align(start)
+
+ block(
+ above: simple_spacing_for_smaller_text,
+ below: simple_spacing_for_smaller_text,
+ )[
+ #figure_footer(
+ note: note,
+ source: source,
+ )
+ ]
+}
+
+#let include_information_of_figure(
+ note: none,
+ source: none,
+ width: auto,
+) = {
+ set align(center)
+ block(
+ above: spacing_for_common_text,
+ below: spacing_for_common_text,
+ width: width,
+ )[
+ #format_information_of_figure(
+ source: source,
+ note: note,
+ )
+ ]
+}
+
+#let format_figure(
+ include_information: false,
+ note: none,
+ source: none,
+ sticky: false,
+ it,
+) = {
+ layout(
+ size => {
+ let width_of_figure_body = measure(
+ width: size.width,
+ it.body,
+ ).width
+
+ block(
+ breakable: true,
+ sticky: sticky,
+ width: 100%,
+ )[
+ // The caption of a figure should be on top of the figure.
+ #block(
+ sticky: true,
+ width: width_of_figure_body,
+ below: spacing_for_common_text,
+ format_caption_of_figure(
+ it.caption,
+ ),
+ )
+
+ #show figure: it => {
+ align(
+ bottom,
+ format_figure(it),
+ )
+ }
+
+ #it.body
+
+ #if include_information {
+ include_information_of_figure(
+ source: source,
+ note: note,
+ width: width_of_figure_body,
+ )
+ }
+ ]
+ },
+ )
+}
+
+#let figure_with_spacing_around = formatted_figure => {
+ let space_around = v(
+ weak: true,
+ spacing_around_figure,
+ )
+ {
+ space_around
+ formatted_figure
+ space_around
+ }
+}
+
+#let describe_figure(
+ note: none,
+ placement: none,
+ source: none,
+ sticky: false,
+ body,
+) = {
+ set block(breakable: true)
+ set grid(gutter: spacing_for_common_text)
+
+ show figure: it => {
+ let formatted_figure = format_figure(
+ include_information: true,
+ note: note,
+ source: source,
+ sticky: sticky,
+ it,
+ )
+
+ set block(breakable: true)
+ if placement == none {
+ figure_with_spacing_around(formatted_figure)
+ } else {
+ let alignment = if (
+ placement == auto
+ ) {
+ auto
+ } else if (placement == top or placement == bottom) {
+ placement + center
+ } else {
+ panic("Placement should be one of the following options: none, auto, top, bottom")
+ }
+
+ place(
+ clearance: spacing_around_figure,
+ float: true,
+ alignment,
+ formatted_figure,
+ )
+ }
+ }
+
+ body
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/figure_footer.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/figure_footer.typ
new file mode 100644
index 0000000000..c2d8e00a6a
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/figure_footer.typ
@@ -0,0 +1,29 @@
+// # Information footer. Rodapé de informação.
+
+#import "./source.typ": source_for_content_created_by_authors
+
+#let figure_footer(
+ note: none,
+ source: none,
+) = [
+ // Figures must have a source, except if explicitly defined.
+ #if not source == false [
+ Fonte:
+ #if source == none {
+ [#source_for_content_created_by_authors().]
+ } else {
+ source
+ }
+ #parbreak()
+ ]
+ #if note != none {
+ if type(note) == array {
+ for (index, item) in note.enumerate() {
+ [Nota #(index + 1): #item]
+ parbreak()
+ }
+ } else {
+ [Nota: #note]
+ }
+ }
+]
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/font_family.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/font_family.typ
new file mode 100644
index 0000000000..e63544f6c8
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/font_family.typ
@@ -0,0 +1,9 @@
+// # Font family. Família tipográfica.
+
+#import "../style/style.typ": font_family_math, font_family_mono, font_family_sans, font_family_serif
+
+#let font_family_for_common_text_state = state("quati_abnt_font_family_for_common_text", font_family_serif)
+#let font_family_for_highlighted_text_state = state("quati_abnt_font_family_for_highlighted_text", font_family_sans)
+#let font_family_for_math_text_state = state("quati_abnt_font_family_for_math_text", font_family_math)
+#let font_family_for_monospaced_text_state = state("quati_abnt_font_family_for_monospaced_text", font_family_mono)
+#let font_family_for_editor_notes_state = state("quati_abnt_font_family_for_editor_notes", font_family_sans)
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/footnote.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/footnote.typ
new file mode 100644
index 0000000000..6036ae1a31
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/footnote.typ
@@ -0,0 +1,14 @@
+// # Footnotes. Notas de rodapé.
+// NBR 14724:2024 5.2.1
+
+#import "../style/style.typ": font_size_for_smaller_text
+
+#let format_footnote_entry(body) = context {
+ set text(size: font_size_for_smaller_text)
+
+ grid(
+ columns: 2,
+ gutter: 3pt,
+ body.note, body.note.body,
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/foreign_text.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/foreign_text.typ
new file mode 100644
index 0000000000..4f427510dd
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/foreign_text.typ
@@ -0,0 +1,14 @@
+// # Text in foreign language. Texto em língua estrangeira.
+
+// Text in foreign language must be emphasized in italics.
+#let foreign_text = (
+ lang: "en",
+ region: "us",
+ it,
+) => emph(
+ text(
+ lang: lang,
+ region: region,
+ it,
+ ),
+)
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/gender.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/gender.typ
new file mode 100644
index 0000000000..8c1bb56017
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/gender.typ
@@ -0,0 +1,22 @@
+// # Gender. Gênero.
+
+#let get_gender_ending(
+ gender,
+ masculine_ends_with_vowel: true,
+ plural: false,
+) = {
+ if gender == "m" {
+ if masculine_ends_with_vowel {
+ "o"
+ } else {
+ if plural {
+ "e"
+ }
+ }
+ } else if gender == "f" {
+ "a"
+ }
+ if plural {
+ "s"
+ }
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/glossary.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/glossary.typ
new file mode 100644
index 0000000000..85b7443c43
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/glossary.typ
@@ -0,0 +1,44 @@
+// # Glossary. Glossário.
+// NBR 14724:2024 4.2.1.11, 4.2.1.12, 4.2.3.2
+
+#import "../packages.typ": glossarium
+
+#let include_glossary(
+ disable_back_references: true,
+ invisible: false,
+ print_gloss: none,
+ outlined: true,
+ title: "Glossário",
+ entries,
+) = context {
+ let arguments = (
+ deduplicate-back-references: true,
+ description-separator: ". ",
+ disable-back-references: disable_back_references,
+ invisible: invisible,
+ )
+
+ let print_glossary = if (print_gloss == none) {
+ () => glossarium.print-glossary(
+ ..arguments,
+ entries,
+ )
+ } else {
+ () => glossarium.print-glossary(
+ ..arguments,
+ user-print-gloss: print_gloss,
+ entries,
+ )
+ }
+
+ if (invisible == false) {
+ set heading(
+ numbering: none,
+ outlined: outlined,
+ )
+ heading(level: 1, title)
+ print_glossary()
+ } else {
+ print_glossary()
+ }
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/heading.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/heading.typ
new file mode 100644
index 0000000000..52d1e226d2
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/heading.typ
@@ -0,0 +1,168 @@
+// # Headings. Títulos.
+
+#import "../../common/components/font_family.typ": font_family_for_highlighted_text_state
+#import "../style/style.typ": (
+ font_size_for_common_text, font_size_for_larger_text, leading_for_common_text, leading_for_larger_text,
+ spacing_for_common_text, spacing_for_larger_text,
+)
+
+#let get_styling_for_heading(
+ should_use_larger_text_to_highlight: false,
+ body,
+) = {
+ // NBR 6024:2012 4.1.
+ // The format of headings should represent their hierarchical level.
+
+ let font_size = font_size_for_common_text
+ let leading = leading_for_common_text
+ let spacing = spacing_for_common_text
+ let font_weight = "regular"
+ let text_style = "normal"
+ let should_capitalize = false
+ let should_underline = false
+
+ if body.level == 1 {
+ font_weight = "bold"
+ if should_use_larger_text_to_highlight {
+ font_size = font_size_for_larger_text
+ let leading = leading_for_larger_text
+ let spacing = spacing_for_larger_text
+ } else {
+ should_capitalize = true
+ }
+ } else if body.level == 2 {
+ if should_use_larger_text_to_highlight {
+ font_size = font_size_for_larger_text
+ let leading = leading_for_larger_text
+ let spacing = spacing_for_larger_text
+ } else {
+ should_capitalize = true
+ }
+ } else if body.level == 3 {
+ font_weight = "bold"
+ } else if body.level == 4 {} else if body.level >= 5 {
+ text_style = "italic"
+ }
+
+ return (
+ font_size,
+ leading,
+ spacing,
+ should_capitalize,
+ font_weight,
+ text_style,
+ should_underline,
+ )
+}
+
+#let capitalize_or_underline_if_needed = (
+ should_capitalize: false,
+ should_underline: false,
+ it,
+) => {
+ if should_capitalize {
+ it = upper(it)
+ }
+ if should_underline {
+ it = underline(it)
+ }
+ it
+}
+
+#let format_heading(
+ should_use_larger_text_to_highlight: false,
+ body,
+) = context {
+ // NBR 14724:2024 5.2.2.
+
+ set text(
+ font: font_family_for_highlighted_text_state.get(),
+ )
+
+ let (
+ font_size,
+ leading,
+ spacing,
+ should_capitalize,
+ font_weight,
+ text_style,
+ should_underline,
+ ) = get_styling_for_heading(
+ should_use_larger_text_to_highlight: should_use_larger_text_to_highlight,
+ body,
+ )
+ let text_before_numbering = none
+ let text_after_numbering = none
+ let column_gutter = measure(sym.dash).width
+
+ set par(
+ leading: leading,
+ spacing: spacing,
+ first-line-indent: 0cm,
+ )
+ set text(
+ size: font_size,
+ weight: font_weight,
+ style: text_style,
+ )
+
+ if body.supplement == [Apêndice] {
+ // NBR 14724:2024 4.2.3.3.
+ // Appendixes must have the supplement "APÊNDICE" before its numbering and an em-dash after it.
+ text_before_numbering = "Apêndice"
+ text_after_numbering = sym.dash.em
+ column_gutter = measure(sym.space).width
+ } else if body.supplement == [Anexo] {
+ // NBR 14724:2024 4.2.3.4.
+ // Annexes must have the supplement "ANEXO" before its numbering and an em-dash after it.
+ text_before_numbering = "Anexo"
+ text_after_numbering = sym.dash.em
+ column_gutter = measure(sym.space).width
+ }
+
+ let prefix = numbering => capitalize_or_underline_if_needed(
+ should_capitalize: should_capitalize,
+ should_underline: should_underline,
+ )[
+ #text_before_numbering
+ #counter(heading).display(numbering)
+ #text_after_numbering
+ ]
+
+ let heading_text = capitalize_or_underline_if_needed(
+ should_capitalize: should_capitalize,
+ should_underline: should_underline,
+ body.body,
+ )
+
+ // NBR 14724:2024 5.2.2.
+ // Headings must have a blank space of 1.5 above and below.
+ let space_around = v(spacing * 2, weak: true)
+
+ space_around
+ if body.numbering == none {
+ // NBR 6024:2012 4.1.
+ // Headings without numbering should be aligned to the center.
+ align(center)[
+ #block(
+ above: spacing,
+ below: spacing,
+ )[#heading_text]
+ ]
+ } else {
+ block(
+ above: spacing,
+ below: spacing,
+ // NBR 6024:2012 4.1.
+ // For headings with multiple lines, each subsequent line should be aligned with the first one.
+ grid(
+ columns: 2,
+ rows: 1,
+ // Numbering indicator should be separated from the title by a single space.
+ column-gutter: column_gutter,
+ prefix(body.numbering), heading_text,
+ ),
+ )
+ }
+ space_around
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/main.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/main.typ
new file mode 100644
index 0000000000..bf98c0dd3f
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/main.typ
@@ -0,0 +1,19 @@
+// # Components. Componentes.
+
+#import "./abstract.typ": include_abstract
+#import "./annex.typ": include_annex
+#import "./appendix.typ": include_appendix
+#import "./bibliography.typ": cite_prose, format_bibliography
+#import "./editor_note.typ": (
+ closed_discussion_note, create_status_note, done_note, editor_note, open_discussion_note, progress_note, todo_note,
+)
+#import "./equation.typ": equation
+#import "./figure.typ": describe_figure
+#import "./foreign_text.typ": foreign_text
+#import "./gender.typ": get_gender_ending
+#import "./glossary.typ": include_glossary
+#import "./source.typ": source_for_content_created_by_authors
+#import "./table.typ": format_table
+#import "./terms.typ": get_term_in_list
+#import "./text.typ": capitalize_first_letter
+#import "./title.typ": print_title
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/quote.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/quote.typ
new file mode 100644
index 0000000000..efac59e596
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/quote.typ
@@ -0,0 +1,49 @@
+// # Quotes. Citações.
+// NBR 14724:2024 5.5, NBR 10520:2023 7.1.1.
+
+#import "../style/style.typ": (
+ font_size_for_common_text, font_size_for_smaller_text, leading_for_common_text, simple_leading_for_smaller_text,
+ simple_spacing_for_smaller_text, spacing_for_common_text,
+)
+
+#let format_quote(
+ indent: true,
+ smaller_text: true,
+ body,
+) = {
+ let font_size = font_size_for_common_text
+ let leading = leading_for_common_text
+ let spacing = spacing_for_common_text
+
+ // Long quotes should have a smaller font size than the main text.
+ if smaller_text {
+ font_size = font_size_for_smaller_text
+ leading = simple_leading_for_smaller_text
+ spacing = simple_spacing_for_smaller_text
+ }
+
+ set text(
+ size: font_size,
+ )
+ set par(
+ leading: leading,
+ spacing: spacing,
+ )
+
+ block(
+ above: spacing,
+ below: spacing,
+ breakable: true,
+ pad(
+ // Long quotes should have a 4cm space on the left side.
+ left: if indent {
+ 4cm
+ } else {
+ 0cm
+ },
+ )[
+ #body.body
+ #if body.attribution != none [#body.attribution]
+ ],
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/source.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/source.typ
new file mode 100644
index 0000000000..a286300205
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/source.typ
@@ -0,0 +1,9 @@
+// # Source. Fonte.
+// NBR 14724:2024 5.8, NBR 14724:2024 5.9
+
+#let source_for_content_created_by_authors(
+ start_with_uppercase: false,
+) = {
+ // NBR 14724:2024
+ [#if start_with_uppercase { "E" } else { "e" }laboração própria]
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/table.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/table.typ
new file mode 100644
index 0000000000..a3ad7cb6ec
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/table.typ
@@ -0,0 +1,42 @@
+// # Tables. Tabelas.
+// NBR 14724:2024 5.9, IBGE Apresentação tabular 1993
+
+#import "../style/style.typ": (
+ font_size_for_smaller_text, simple_leading_for_smaller_text, simple_spacing_for_smaller_text,
+)
+
+#let format_table(body) = {
+ // IBGE Apresentação tabular 1993 4.3.3
+ // Tables should not have vertical lines
+ // Tables should have horizontal lines only around header and at bottom of the table
+ set table(stroke: (x, y) => (
+ top: if y <= 1 { 1pt } else { 0pt },
+ bottom: 1pt,
+ ))
+
+ // Table header should be bold
+ show table.cell.where(y: 0): strong
+
+ // The first column should be left-aligned, and the following columns should be right-aligned
+ set table(
+ align: (x, y) => {
+ if y == 0 {
+ center + horizon
+ } else if x == 0 {
+ left + horizon
+ } else {
+ right + horizon
+ }
+ },
+ )
+
+ // The content of a table should be in a smaller font size
+ set text(
+ size: font_size_for_smaller_text,
+ )
+ set par(
+ leading: simple_leading_for_smaller_text,
+ spacing: simple_spacing_for_smaller_text,
+ )
+ body
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/terms.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/terms.typ
new file mode 100644
index 0000000000..e3df095e23
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/terms.typ
@@ -0,0 +1,43 @@
+// # Terms. Termos.
+
+#let get_term_in_list(
+ capitalize: false,
+ field: "short",
+ plural: false,
+ terms_entries: (),
+ term_key,
+) = {
+ let entry = terms_entries.find(
+ e => e.key == term_key,
+ )
+
+ if entry == none {
+ panic("Termo não encontrado: " + term_key + ".")
+ }
+
+ if field == "short" {
+ if capitalize == false {
+ if plural == false {
+ entry.at("short", default: none)
+ } else {
+ entry.at("plural", default: entry.at("short", default: none))
+ }
+ } else {
+ if plural == false {
+ entry.at("short_capitalized", default: entry.at("short", default: none))
+ } else {
+ entry.at("plural_capitalized", default: entry.at("short", default: none))
+ }
+ }
+ } else if field == "long" {
+ if plural == false {
+ entry.at("long", default: entry.at("short", default: none))
+ } else {
+ entry.at("long_plural", default: entry.at("short", default: none))
+ }
+ } else if field == "custom" {
+ entry.at("custom", default: entry.at("short", default: none))
+ } else {
+ panic("Campo inválido: " + field + ". Use 'short', 'long' ou 'custom'.")
+ }
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/text.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/text.typ
new file mode 100644
index 0000000000..7550d44861
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/text.typ
@@ -0,0 +1,8 @@
+// # Text. Texto.
+
+#let capitalize_first_letter = text => {
+ if text == none {
+ none
+ }
+ upper(text.at(0)) + text.slice(1)
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/components/title.typ b/packages/preview/quati-abnt/0.1.0/src/common/components/title.typ
new file mode 100644
index 0000000000..b99751b09a
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/components/title.typ
@@ -0,0 +1,21 @@
+// # Title. Título do trabalho.
+
+#let print_title(
+ title: "Título do trabalho",
+ subtitle: none,
+ with_weight: true,
+) = {
+ let weight = if with_weight { "bold" } else { "regular" }
+
+ text(
+ weight: weight,
+ )[
+ #title#if subtitle != none [:
+ #text(
+ weight: "regular",
+ )[
+ #subtitle
+ ]
+ ]
+ ]
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/main.typ b/packages/preview/quati-abnt/0.1.0/src/common/main.typ
new file mode 100644
index 0000000000..c1fee15dad
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/main.typ
@@ -0,0 +1,5 @@
+// # Common. Comum.
+
+#import "./components/main.typ" as components
+#import "./packages.typ" as packages
+#import "./style/style.typ" as style
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/packages.typ b/packages/preview/quati-abnt/0.1.0/src/common/packages.typ
new file mode 100644
index 0000000000..d5062cd6d9
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/packages.typ
@@ -0,0 +1,5 @@
+// # Packages. Pacotes.
+
+// ## Glossary. Glossário.
+// NBR 6022:2018 6.4
+#import "@preview/glossarium:0.5.10" /* From 0.5.10 */ as glossarium
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/style/bibliography_style.csl b/packages/preview/quati-abnt/0.1.0/src/common/style/bibliography_style.csl
new file mode 100644
index 0000000000..03008267cc
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/style/bibliography_style.csl
@@ -0,0 +1,1051 @@
+
+
+
+
+
+
+
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/style/bibliography_style_prose.csl b/packages/preview/quati-abnt/0.1.0/src/common/style/bibliography_style_prose.csl
new file mode 100644
index 0000000000..c60e53a47b
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/style/bibliography_style_prose.csl
@@ -0,0 +1,1053 @@
+
+
+
+
+
+
+
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/style/style.typ b/packages/preview/quati-abnt/0.1.0/src/common/style/style.typ
new file mode 100644
index 0000000000..8b2babd7de
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/style/style.typ
@@ -0,0 +1,79 @@
+// # Style. Estilo.
+
+// ## Paper size. Tamanho do papel.
+// NBR 14724:2024 5.1.
+#let paper_size = "a4"
+
+// ## Margins. Margens.
+// NBR 14724:2024 5.1.
+#let margin_top = 3.0cm
+#let margin_bottom = 2.0cm
+#let margin_start = 3.0cm
+#let margin_end = 2.0cm
+
+// ## Ident. Recuo.
+// NBR 6024:2012.
+#let indentation_for_paragraphs = 1.25cm
+#let indentation_for_subparagraphs = indentation_for_paragraphs
+
+// ## Font family. Família tipográfica.
+#let font_family_sans = "Liberation Sans"
+#let font_family_serif = "Liberation Serif"
+#let font_family_mono = "Liberation Mono"
+#let font_family_math = "New Computer Modern Math"
+#let font_family_math_text = "New Computer Modern"
+
+// ## Font size. Tamanho da fonte.
+// NBR 14724:2024 5.1, NBR 6022:2018 6.1.
+#let font_size_for_larger_text = 13pt
+#let font_size_for_common_text = 12pt
+// Smaller text must be used for: quotations with more than 3 lines, footnotes, page numbering, cataloging-in-publication, references and information of figures and tables.
+#let font_size_for_smaller_text = 11pt
+
+// ## Spacing. Espaçamento.
+// NBR 14724:2024 5.2, NBR 6022:2018 6.1.
+//
+// ### Multipliers. Multiplicadores.
+#let spacing_of_one = 1.0 / 2
+#let spacing_of_one_and_a_half = 1.5 / 2
+//
+// ### Common text. Texto comum.
+// Spacing of 1.5 must be used for common text.
+#let spacing_for_larger_text = font_size_for_larger_text * spacing_of_one_and_a_half
+#let spacing_for_common_text = font_size_for_common_text * spacing_of_one_and_a_half
+//
+// ### Smaller text. Texto menor.
+// Spacing of 1 must be used for: quotations with more than 3 lines, footnotes, nature, references and information of figures and tables. We interpret that nature should also use this leading.
+#let simple_spacing_for_smaller_text = font_size_for_smaller_text * spacing_of_one
+//
+// ### Bibliography. Bibliografia.
+// NBR 6023:2025 6.3.
+// There must be a blank space of 1 simple line between bibliography entries.
+#let spacing_for_bibliography = font_size_for_common_text * spacing_of_one * 2
+
+// ## Leading. Entrelinha.
+// NBR 14724:2024 5.2.
+//
+// ### Multipliers. Multiplicadores.
+#let leading_of_one = spacing_of_one
+#let leading_of_one_and_a_half = spacing_of_one_and_a_half
+//
+// ### Common text. Texto comum.
+// Leading of 1.5 must be used for common text.
+#let leading_for_larger_text = font_size_for_larger_text * leading_of_one_and_a_half
+#let leading_for_common_text = font_size_for_common_text * leading_of_one_and_a_half
+//
+// ### Smaller text. Texto menor.
+// Leading of 1 must be used for: quotations with more than 3 lines, footnotes, nature, references and information of figures and tables. We interpret that nature should also use this leading.
+#let simple_leading_for_smaller_text = font_size_for_smaller_text * leading_of_one
+//
+// ### Bibliography. Bibliografia.
+// NBR 6023:2025 6.3.
+// Leading of 1 must be used for bibliography.
+#let leading_for_bibliography = font_size_for_common_text * leading_of_one
+
+// ## Figures. Figuras.
+#let spacing_around_figure = spacing_for_common_text
+
+// ## Links. Ligações.
+#let color_of_links = oklch(15%, 0.17, 264.05deg)
diff --git a/packages/preview/quati-abnt/0.1.0/src/common/template.typ b/packages/preview/quati-abnt/0.1.0/src/common/template.typ
new file mode 100644
index 0000000000..3e00f2a7b6
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/common/template.typ
@@ -0,0 +1,183 @@
+// # Template. Modelo.
+
+#import "./components/bibliography.typ": format_bibliography
+#import "./components/editor_note.typ": should_display_editor_notes_state
+#import "./components/figure.typ": figure_with_spacing_around
+#import "components/font_family.typ": (
+ font_family_for_common_text_state, font_family_for_editor_notes_state, font_family_for_highlighted_text_state,
+ font_family_for_math_text_state, font_family_for_monospaced_text_state, font_family_math, font_family_mono,
+ font_family_sans, font_family_serif,
+)
+#import "./components/footnote.typ": format_footnote_entry
+#import "./components/heading.typ": format_heading
+#import "./components/quote.typ": format_quote
+#import "./style/style.typ": (
+ font_size_for_common_text, indentation_for_paragraphs, indentation_for_subparagraphs, leading_for_common_text,
+ paper_size, simple_leading_for_smaller_text, simple_spacing_for_smaller_text, spacing_for_common_text,
+)
+
+
+#let should_use_larger_text_to_highlight_state = state("quati_abnt_should_use_larger_text_to_highlight", true)
+
+
+#let template(
+ doc,
+ //
+ // Color to format links.
+ color_of_links: none,
+ //
+ // Font families.
+ font_family_for_common_text: font_family_serif,
+ font_family_for_highlighted_text: font_family_sans,
+ font_family_for_math_text: font_family_math,
+ font_family_for_monospaced_text: font_family_mono,
+ font_family_for_editor_notes: font_family_sans,
+ //
+ // Whether to use uppercase as typographic highlight.
+ should_use_larger_text_to_highlight: false,
+ // Whether to display editor notes.
+ should_display_editor_notes: true,
+) = {
+ font_family_for_common_text_state.update(font_family_for_common_text)
+ font_family_for_highlighted_text_state.update(font_family_for_highlighted_text)
+ font_family_for_math_text_state.update(font_family_for_math_text)
+ font_family_for_monospaced_text_state.update(font_family_for_monospaced_text)
+ font_family_for_editor_notes_state.update(font_family_for_editor_notes)
+
+ should_use_larger_text_to_highlight_state.update(should_use_larger_text_to_highlight)
+
+ should_display_editor_notes_state.update(should_display_editor_notes)
+
+ // ## Page. Página.
+ set page(
+ paper: paper_size,
+ )
+
+ // ## Text. Texto.
+ set text(
+ lang: "pt",
+ region: "br",
+ font: font_family_for_common_text,
+ size: font_size_for_common_text,
+ hyphenate: true,
+ )
+ show raw: set text(font: font_family_for_monospaced_text)
+ show math.equation: set text(font: font_family_for_math_text)
+
+ // ## Paragraphs. Parágrafos.
+ set par(
+ first-line-indent: (
+ amount: indentation_for_paragraphs,
+ all: true,
+ ),
+ leading: leading_for_common_text,
+ spacing: spacing_for_common_text,
+ justify: true,
+ )
+
+ // ## Heading. Títulos.
+ set heading(
+ numbering: "1.1",
+ )
+
+ // ## Lists. Listas.
+ set list(
+ indent: indentation_for_subparagraphs,
+ )
+ show list: it => {
+ set list(indent: 0em)
+ it
+ }
+ set enum(
+ indent: indentation_for_subparagraphs,
+ numbering: "a)",
+ )
+ show enum: it => {
+ set enum(indent: 0em)
+ it
+ }
+
+ // ## Links. Ligações.
+ show link: it => {
+ // TODO: use if type(it.dest) != label
+ if (color_of_links != none) {
+ set text(fill: color_of_links)
+ it
+ } else {
+ it
+ }
+ }
+
+ // ## Citations. Citações.
+ show cite: it => {
+ if (color_of_links != none) {
+ set text(fill: color_of_links)
+ it
+ } else {
+ it
+ }
+ }
+
+ // ## References. Referências.
+ show ref: it => {
+ // NBR 6024:2012.
+ let content = if (color_of_links != none) {
+ set text(fill: color_of_links)
+ it
+ } else {
+ it
+ }
+
+ content
+ }
+
+ // ## Equations. Equações.
+ // NBR 14724:2024 5.7
+ set math.equation(
+ numbering: "(1.1)",
+ supplement: "Equação",
+ )
+
+ // ## Figures. Figuras.
+ // NBR 14724:2024 5.8
+ set figure.caption(
+ // The caption of a figure should be on top of the figure
+ position: top,
+ // The indicator and numbering of the figure should be separated by a em-dash from the following caption text
+ separator: [ #sym.dash.em ],
+ )
+
+ // ## Quotes. Citações.
+ // NBR 10520:2023 7.1.1
+ show quote: it => {
+ // Long quotes (more than 3 lines) should be blocks.
+ if it.block {
+ format_quote(it)
+ } else {
+ it
+ }
+ }
+
+ // ## Footnotes. Notas de rodapé.
+ // NBR 14724:2024 5.2.1
+ set footnote.entry(
+ gap: simple_leading_for_smaller_text,
+ clearance: simple_spacing_for_smaller_text,
+ separator: line(length: 5cm),
+ indent: 0cm,
+ )
+ show footnote.entry: it => {
+ format_footnote_entry(it)
+ }
+
+ // ## Bibliography. Referências.
+ // NBR 6023:2025 6, NBR 14724:2024 4.2.3.1
+ set bibliography(
+ // The bibliography should be formatted according to the ABNT style
+ style: "./style/bibliography_style.csl",
+ title: "Referências",
+ )
+ show bibliography: it => format_bibliography(it)
+
+ doc
+}
diff --git a/packages/preview/quati-abnt/0.1.0/src/lib.typ b/packages/preview/quati-abnt/0.1.0/src/lib.typ
new file mode 100644
index 0000000000..e431f67621
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/src/lib.typ
@@ -0,0 +1,5 @@
+// # Library. Biblioteca.
+
+#import "./academic_work/main.typ" as academic_work
+#import "./article/main.typ" as article
+#import "./common/main.typ" as common
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/assets/images/black_square.png b/packages/preview/quati-abnt/0.1.0/template/academic_work/assets/images/black_square.png
new file mode 100644
index 0000000000..2744a9f8b0
Binary files /dev/null and b/packages/preview/quati-abnt/0.1.0/template/academic_work/assets/images/black_square.png differ
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/components.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/components.typ
new file mode 100644
index 0000000000..eec34978d8
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/components.typ
@@ -0,0 +1,64 @@
+// # Components. Componentes.
+
+#import "./data/terms.typ": get_term
+#import "./packages.typ": (
+ quati-abnt, quati-abnt.academic_work.components.include_epigraph, quati-abnt.academic_work.components.print_people,
+ quati-abnt.academic_work.components.print_person, quati-abnt.common.components.cite_prose,
+ quati-abnt.common.components.closed_discussion_note, quati-abnt.common.components.create_status_note,
+ quati-abnt.common.components.describe_figure, quati-abnt.common.components.done_note,
+ quati-abnt.common.components.editor_note, quati-abnt.common.components.equation,
+ quati-abnt.common.components.foreign_text, quati-abnt.common.components.format_table,
+ quati-abnt.common.components.open_discussion_note, quati-abnt.common.components.progress_note,
+ quati-abnt.common.components.source_for_content_created_by_authors, quati-abnt.common.components.todo_note,
+)
+
+
+// ## Editor notes. Notas de editor.
+
+#let review_note = (
+ prefixes: none,
+ it,
+) => {
+ let color = oklch(82.01%, 0.159, 323.15deg)
+ create_status_note(
+ fill: color,
+ prefixes: prefixes,
+ status: "REVISAR",
+ stroke: color.saturate(50%),
+ it,
+ )
+}
+
+#let note_from_alice = (
+ note: editor_note,
+ it,
+) => {
+ let color = oklch(85%, 0.097, 19.33deg)
+ note(
+ prefixes: (
+ (
+ fill: color,
+ body: "Alice",
+ stroke: color.saturate(25%),
+ ),
+ ),
+ it,
+ )
+}
+
+#let note_from_gabriel = (
+ note: editor_note,
+ it,
+) => {
+ let color = oklch(80.43%, 0.1, 278.25deg)
+ note(
+ prefixes: (
+ (
+ body: "Gabriel",
+ fill: color,
+ stroke: color.saturate(25%),
+ ),
+ ),
+ it,
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/content/abstract.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/abstract.typ
new file mode 100644
index 0000000000..2c54f3dd78
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/abstract.typ
@@ -0,0 +1,65 @@
+// # Abstract. Resumo.
+// NBR 14724:2024 4.2.1.7, NBR 14724:2024 4.2.1.8
+
+#import "../packages.typ": glossarium, quati-abnt.academic_work.pages.include_abstract_page
+
+
+// ## Abstract in main language. Resumo em língua principal.
+#let abstract_in_main_language = {
+ (
+ keywords_title: "Palavras-chave",
+ keywords: (
+ "modelo",
+ "trabalho acadêmico",
+ "ABNT",
+ "Typst",
+ ),
+ title: "Resumo",
+ body: [
+ Este exemplo apresenta o uso do `quati-abnt`, modelo de artigo para o Typst segundo as @nbr:pl da @abnt.
+ ],
+ )
+}
+
+
+// ## Abstract in foreign language. Resumo em língua estrangeira.
+#let first_abstract_in_foreign_language = {
+ (
+ keywords_title: "Keywords",
+ keywords: (
+ "template",
+ "academic work",
+ "ABNT",
+ "Typst",
+ ),
+ title: "Abstract",
+ body: [
+ #text(
+ lang: "en",
+ region: "us",
+ )[
+ This exemple presents the use of the `quati-abnt`, a paper template for Typst according to the #glossarium.gls("nbr", plural: true, display: "Brazilian Norms (NBRs)") from the #glossarium.gls("abnt", display: "Brazilian Association of Technical Norms (ABNT)").
+ ]
+ ],
+ )
+}
+
+
+// ## Lista de resumos.
+// Include in this list all abstracts in the order they should appear.
+// Inclua nessa lista todos os resumos da ordem em que eles devem aparecer.
+#let abstracts = (
+ abstract_in_main_language,
+ first_abstract_in_foreign_language,
+)
+
+
+// ## Display. Exibição.
+#for abstract in abstracts {
+ include_abstract_page(
+ body: abstract.body,
+ keywords_title: abstract.keywords_title,
+ keywords: abstract.keywords,
+ title: abstract.title,
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/content/external.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/external.typ
new file mode 100644
index 0000000000..390a987b70
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/external.typ
@@ -0,0 +1,21 @@
+// # External elements. Elementos externos.
+// NBR 14724:2024 4.1
+
+#import "../data/data.typ": address, authors, institution, organization, program, subtitle, title, volume_number, year
+#import "../packages.typ": quati-abnt.academic_work.pages.include_cover
+
+
+// ## Cover. Capa.
+// NBR 14724:2024 4.1.1
+
+#include_cover(
+ address: address,
+ authors: authors,
+ institution: institution,
+ organization: organization,
+ program: program,
+ subtitle: subtitle,
+ title: title,
+ volume_number: volume_number,
+ year: year,
+)
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/content/post_textual.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/post_textual.typ
new file mode 100644
index 0000000000..eb7ec38575
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/post_textual.typ
@@ -0,0 +1,52 @@
+// # Post-textual elements. Elementos pós-textuais.
+// NBR 14724:2024 4.2.3
+
+#import "../data/glossary.typ": glossary_entries
+#import "../components.typ": *
+#import "../packages.typ": (
+ quati-abnt.academic_work.pages.include_glossary_page, quati-abnt.common.components.include_annex,
+ quati-abnt.common.components.include_appendix,
+)
+
+
+// ====================
+// ## Glossary. Glossário.
+// NBR 14724:2024 4.2.3.2
+
+#include_glossary_page(
+ disable_back_references: true,
+ glossary_entries,
+)
+
+// ====================
+
+
+// ====================
+// ## Appendixes. Apêndices.
+// NBR 14724:2024 4.2.3.3
+
+#counter(heading).update(0)
+
+#include_appendix(
+ title: [#lorem(20)],
+ label: ,
+)[
+ #lorem(50)
+]
+
+// ====================
+
+// ====================
+// ## Annexes. Anexos.
+// NBR 14724:2024 4.2.3.4
+
+#counter(heading).update(0)
+
+#include_annex(
+ title: [Quod idem licet transferre in voluptatem, ut],
+ label: ,
+)[
+ #lorem(50)
+]
+
+// ====================
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/content/pre_textual.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/pre_textual.typ
new file mode 100644
index 0000000000..5867d4f3ca
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/pre_textual.typ
@@ -0,0 +1,242 @@
+// # Pre-textual elements. Elementos pré-textuais.
+// NBR 14724:2024 4.2.1
+
+#import "../data/data.typ": (
+ address, advisors, approval_date, area_of_concentration, authors, custom_nature, degree, degree_topic,
+ examination_committee, institution, organization, program, subtitle, title, type_of_work, volume_number, year,
+)
+#import "../data/glossary.typ": abbreviations_entries, symbols_entries
+#import "../packages.typ": (
+ quati-abnt.academic_work.pages.include_acknowledgments_page, quati-abnt.academic_work.pages.include_approval_page,
+ quati-abnt.academic_work.pages.include_cataloging_in_publication,
+ quati-abnt.academic_work.pages.include_custom_cataloging_in_publication,
+ quati-abnt.academic_work.pages.include_dedication_page, quati-abnt.academic_work.pages.include_epigraph_page,
+ quati-abnt.academic_work.pages.include_errata_page, quati-abnt.academic_work.pages.include_list_of_abbreviations_page,
+ quati-abnt.academic_work.pages.include_list_of_figures_page,
+ quati-abnt.academic_work.pages.include_list_of_symbols_page,
+ quati-abnt.academic_work.pages.include_list_of_tables_page, quati-abnt.academic_work.pages.include_outline_page,
+ quati-abnt.academic_work.pages.include_title_page,
+)
+#import "./abstract.typ": abstract_in_main_language
+
+#let keywords_in_main_language = abstract_in_main_language.keywords
+
+
+// ====================
+// ## Title page. Folha de rosto.
+// NBR 14724:2024 4.2.1.1.1
+
+#include_title_page(
+ address: address,
+ advisors: advisors,
+ area_of_concentration: area_of_concentration,
+ authors: authors,
+ custom_nature: custom_nature,
+ degree_topic: degree_topic,
+ degree: degree,
+ organization: organization,
+ program: program,
+ subtitle: subtitle,
+ title: title,
+ type_of_work: type_of_work,
+ volume_number: volume_number,
+ year: year,
+)
+
+// ====================
+
+
+// ====================
+// ## Cataloging-in-publication. Ficha catalográfica.
+// NBR 14724:2024 4.2.1.1.2
+
+// This is just an example for the cataloging in publication. When your institution provides you with the final file, you must use the command `include_custom_cataloging_in_publication`, filling it with the command `image` and with the path to the file. Then, remove the command `include_cataloging_in_publication` below.
+//
+// Este é apenas um exemplo para a ficha catalográfica. Quando sua instituição fornecer o arquivo final, você deve usar o comando `include_custom_cataloging_in_publication`, preenchendo-o com o comando `image` e com caminho para o arquivo. Então, remova o comando `include_cataloging_in_publication` abaixo.
+
+#include_cataloging_in_publication(
+ address: address,
+ advisors: advisors,
+ authors: authors,
+ degree: degree,
+ institution: institution,
+ keywords_in_main_language: keywords_in_main_language,
+ organization: organization,
+ program: program,
+ subtitle: subtitle,
+ title: title,
+ type_of_work: type_of_work,
+ volume_number: volume_number,
+ year: year,
+)
+
+// If you have a file to import, use the command below.
+// Se você tem um arquivo para importar, use o comando abaixo.
+
+// #include_custom_cataloging_in_publication(image("../assets/documents/ficha_catalografica.pdf"))
+
+// ====================
+
+
+// ====================
+// ## Errata. Errata.
+// NBR 14724:2024 4.2.1.2
+
+// If there is not anything to correct, you can just remove the following block.
+//
+// Se não houver alguma correção a fazer, você pode apenas remover o bloco a seguir.
+
+#include_errata_page()[
+ #lorem(50)
+]
+
+// ====================
+
+
+// ====================
+// ## Approval page. Folha de aprovação.
+// NBR 14724:2024 4.2.1.3
+
+#include_approval_page(
+ address: address,
+ advisors: advisors,
+ approval_date: approval_date,
+ area_of_concentration: area_of_concentration,
+ authors: authors,
+ custom_nature: custom_nature,
+ degree_topic: degree_topic,
+ degree: degree,
+ examination_committee: examination_committee,
+ organization: organization,
+ program: program,
+ subtitle: subtitle,
+ title: title,
+ type_of_work: type_of_work,
+ volume_number: volume_number,
+ year: year,
+)
+
+// ====================
+
+
+// ====================
+// ## Dedication. Dedicatória.
+// NBR 14724:2024 4.2.1.4, NBR 14724:2024 5.2.4
+
+// If there is not any dedication, you can just remove the following block.
+//
+// Se não houver alguma dedicatória a fazer, você pode apenas remover o bloco a seguir.
+
+#include_dedication_page()[
+ Dedicamos este trabalho àqueles que contribuem com a organização e com o compartilhamento da informação, sobretudo àqueles que o fazem de forma livre e cooperativa.
+]
+
+// ====================
+
+
+// ====================
+// ## Acknowledgments. Agradecimentos.
+// NBR 14724:2024 4.2.1.6
+
+// If there is not any acknowledgments, you can just remove the following block.
+//
+// Se não houver algum agradecimento a fazer, você pode apenas remover o bloco a seguir.
+
+#include_acknowledgments_page()[
+ Agradecemos ao Grupo de Educação Tutorial em Sistemas de Informação (GetSi) da Universidade Federal de Juiz de Fora (UFJF) por prover bolsas de graduação que possibilitaram a realização deste trabalho.
+]
+
+// ====================
+
+
+// ====================
+// ## Epigraph. Epígrafe.
+// NBR 14724:2024 4.2.1.6
+
+// If there is not any epigraph, you can just remove the following block.
+//
+// Se não houver alguma epígrafe a fazer, você pode apenas remover o bloco a seguir.
+
+#{
+ set par(first-line-indent: 0pt)
+ include_epigraph_page(
+ quote(
+ attribution: [@dumont:1918:o_que_eu_vi_o_que_nos_veremos[p. 15].],
+ block: true,
+ )[
+
+ --- Quero um balão de cem metros cúbicos.
+
+ Grande espanto!
+ Creio mesmo que pensaram que eu era doido.
+ Alguns meses depois, o "Brasil", com grande espanto de todos os entendidos, atravessava Paris, lindo na sua transparência, como uma grande bola de sabão
+ ],
+ )
+}
+
+// ====================
+
+
+// ====================
+
+#include "abstract.typ"
+
+// ====================
+
+
+// ====================
+// ## List of figures. Lista de ilustrações.
+// NBR 14724:2024 4.2.1.9
+
+#context {
+ if counter(figure).final().first() > 0 {
+ include_list_of_figures_page()
+ }
+}
+
+// ====================
+
+
+// ====================
+// ## List of tables. Lista de tabelas.
+// NBR 14724:2024 4.2.1.10
+
+#context {
+ if counter(table).final().first() > 0 {
+ include_list_of_tables_page()
+ }
+}
+// ====================
+
+
+// ====================
+// ## Abbreviations. Lista de abreviaturas e siglas.
+// NBR 14724:2024 4.2.1.11
+
+#if (abbreviations_entries.len() > 0) {
+ include_list_of_abbreviations_page(
+ abbreviations_entries,
+ )
+}
+// ====================
+
+
+// ====================
+// ## List of symbols. Lista de símbolos.
+// NBR 14724:2024 4.2.1.12
+
+#if (symbols_entries.len() > 0) {
+ include_list_of_symbols_page(
+ symbols_entries,
+ )
+}
+// ====================
+
+
+// ====================
+// ## Outline. Sumário.
+// NBR 6027:2012, NBR 14724:2024 4.2.1.13
+
+#include_outline_page()
+
+// ====================
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/considerations.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/considerations.typ
new file mode 100644
index 0000000000..6ff3ae43c8
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/considerations.typ
@@ -0,0 +1,9 @@
+#import "../../components.typ": *
+#import "../../packages.typ": *
+
+= Considerações finais
+
+== Apêndices e anexos
+
+Para elaborar um apêndice ou um anexo, edite o arquivo `/content/post_textual.typ`.
+Se você atribuir um rótulo a um apêndice, ele pode ser citado no texto, assim como os capítulos e seções.
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/foundation.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/foundation.typ
new file mode 100644
index 0000000000..b9bc146fdc
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/foundation.typ
@@ -0,0 +1,260 @@
+#import "../../components.typ": *
+#import "../../packages.typ": *
+
+
+= Fundamentação teórica
+
+
+== Notas
+
+Você pode adicionar notas de editor para comunicar com seus colaboradores o progresso do trabalho.
+
+No momento de exportar seu trabalho, lembre-se de desativar a exibição das notas.
+Faça isso alterando a definição do modelo no arquivo `/main.typ`.
+Defina o parâmetro `should_display_editor_notes: false`.
+
+Para incluir uma nota auxiliar, deve-se utilizar um dos ambientes de definição de nota.
+
+O primeiro ambiente é o `editor_note`.
+Ele permite abrir uma caixa de texto, na qual você pode escrever sua nota.
+
+#editor_note[
+ Nota criada com o comando `editor_note`.
+]
+
+Você também pode definir os seguintes parâmetros nas notas:
++ `fill`: cor de preenchimento da nota;
++ `stroke`: definições da borda da nota.
+
+#editor_note(
+ fill: red.lighten(75%),
+ stroke: red,
+)[
+ Nota criada com o comando `editor_note`, definindo as cores de preenchimento e da borda.
+]
+
+=== Notas prefixadas
+
+Você pode criar uma nota com um prefixo.
+Para isso, utilize o comando `editor_note`, definindo o parâmetro `prefixes` com o texto desejado no parâmetro `body`.
+
+#editor_note(
+ prefixes: (body: [Prefixo]),
+)[
+ Nota prefixada.
+]
+
+==== Personalização de notas prefixadas
+
+Você pode definir os demais atributos normalmente para uma nota com prefixo.
++ Se definir uma cor com o parâmetro `fill`, o prefixo utilizará um tom mais acinzentado dessa mesma cor.
++ Já a cor do parâmetro `stroke` é utilizada com o mesmo tom para a borda do prefixo.
+
+#editor_note(
+ fill: yellow,
+ prefixes: (body: [Prefixo]),
+ stroke: blue,
+)[
+ Nota prefixada.
+ Ela define a cor do preenchimento da nota como amarelo e sua borda como azul.
+]
+
+Você também pode definir a cor do prefixo diretamente, utilizando o parâmetro `fill` dentro da sua definição.
+
+#editor_note(
+ prefixes: (
+ body: [Prefixo],
+ fill: yellow,
+ ),
+)[
+ Nota prefixada.
+ Ela define diretamente a cor do prefixo como amarelo.
+]
+
+Sinta-se livre para editar cada uma dessas propriedades independentemente.
+
+#editor_note(
+ fill: blue.lighten(80%),
+ stroke: blue.lighten(60%),
+ prefixes: (
+ body: [Prefixo],
+ fill: yellow,
+ stroke: yellow.darken(10%),
+ ),
+)[
+ Nota prefixada.
+ Ela define a cor da nota como azul claro, e a sua cor de borda como azul comum.
+ Já o prefixo é preenchido com amarelo, e sua borda é um amarelo um pouco escurecido.
+]
+
+==== Uso de múltiplos prefixos
+
+Uma nota pode ter vários prefixos.
+Para fazer isso, basta preencher o parâmetro `prefixes` com uma lista de definições de `body` e os demais atributos de prefixo --- `fill`, e `stroke`.
+
+#editor_note(
+ prefixes: (
+ (body: [Primeiro]),
+ (body: [Segundo], fill: yellow),
+ (body: [Terceiro], stroke: blue),
+ ),
+)[
+ Nota colocada em linha.
+ Ela inclui três prefixos.
+]
+
+=== Notas de estado
+
+A biblioteca `quati_abnt` define algumas notas úteis para definir o estado de progressão de partes do texto.
+
+A primeira é chamada `todo_note`, e deve ser utilizada para indicar um afazer que ainda não teve início.
+#todo_note[
+ Tarefa a fazer.
+]
+
+A segunda é chamada `progress_note`, e deve ser utilizada para indicar um afazer que teve início, mas ainda está em progresso.
+#progress_note[
+ Tarefa em progresso.
+]
+
+A terceira é chamada `done_note`, e deve ser utilizada para indicar um afazer que foi finalizado.
+#done_note[
+ Tarefa finalizada.
+]
+
+Você também pode definir novas notas de estado no arquivo `/components.typ`.
+Neste modelo, definimos uma nota utilizada para indicar que se deve revisar determinado conteúdo, chamada `review_note`.
+#review_note[
+ Conteúdo que precisa ser revisado.
+]
+
+=== Notas de autores
+
+Você também pode definir no arquivo `/components.typ` notas para cada um dos autores. Definimos neste guia notas para o Gabriel e para a Alice.
+
+#note_from_gabriel[Nota do Gabriel.]
+#note_from_alice[Nota da Alice.]
+
+As notas de autores podem ser compostas com notas de estado. Para isso, defina o parâmetro `note` com o comando utilizado para criar a nota de estado desejada. O exemplo a seguir cria uma nota do tipo `todo_note` para o Gabriel.
+
+#note_from_gabriel(
+ note: todo_note,
+)[
+ Nota de afazeres do Gabriel.
+]
+
+=== Notas aninhadas
+
+Se preferir, você ainda pode aninhar notas de diversas formas.
+
+#editor_note[
+ #todo_note[
+ Nota de afazeres.
+ ]
+ #note_from_alice[
+ Sugestão da Alice.
+ ]
+]
+
+#todo_note[
+ #note_from_gabriel[
+ Nota do Gabriel.
+ ]
+ #note_from_alice[
+ Nota da Alice.
+ ]
+]
+
+Definimos mais duas notas padrão para representar discussões entre os editores.
+A primeira, cujo comando é `open_discussion_note`, representa uma discussão ativa.
+
+#open_discussion_note[
+ #note_from_gabriel[
+ Questionamento do Gabriel.
+ ]
+ #note_from_alice[
+ Questionamento da Alice.
+ #note_from_gabriel[
+ Resposta do Gabriel.
+ ]
+ ]
+]
+
+Já o comando `closed_discussion_note` representa uma discussão já finalizada.
+
+#closed_discussion_note[
+ #note_from_gabriel[
+ Comentário do Gabriel.
+ #note_from_alice[
+ Resposta da Alice.
+ #note_from_gabriel[
+ Réplica do Gabriel.
+ #note_from_gabriel(note: todo_note)[
+ Afazer do Gabriel baseado na discussão.
+ ]
+ ]
+ ]
+ ]
+]
+
+
+== Glossário
+
+A @abnt define três tipos de listas de termos, cada uma com sua finalidade específica.
+Todas são opcionais.
+A primeira delas é a de abreviaturas e siglas, que deve constar nos elementos pré-textuais.
+A segunda é a de símbolos, que também deve constar nos elementos pré-textuais.
+A terceira é a lista de termos e definições, que deve constar nos elementos pós-textuais.
+
+Caso um termo tenha uma forma curta e uma longa, a biblioteca irá expandir as duas formas na primeira vez em que você utilizar esse termo.
+Nas seguintes, apenas as formas curtas aparecerão.
+
+Você pode definir os elementos dessas listas no arquivo `/data/glossary.typ`.
+
+=== Lista de abreviaturas e siglas
+
+Observe exemplos de termos que representam abreviaturas ou siglas.
+
+#list(
+ [@abnt],
+ [@ibge],
+ [@bi],
+)
+
+=== Lista de símbolos
+
+Observe exemplos de termos que representam símbolos.
+É recomendado que eles apresentem uma entrada de descrição, que será exibida no glossário.
+
+#list(
+ [@emptyset],
+)
+
+=== Lista de termos e definições no glossário
+
+Observe exemplos de demais termos registrados no glossário.
+
+#list(
+ [@firewall],
+ [@aprendizado_maquina],
+ [@fitness],
+)
+
+=== Lista de termos simples, não adicionados ao glossário
+
+Caso você utilize bastante algum termo, mas não deseja que ele seja colocado em nenhuma lista de glossário, você pode defini-lo como um termo útil.
+
+Para isso, inclua-os no arquivo `/data/terms.typ`.
+Então, você pode inseri-los no texto com o comando `get_term`.
+
+Você também pode definir formas no plural e com letras maiúsculas.se caso, utilize os atributos `plural` e `capitalize` para acessá-las.
+
+#list(
+ [#get_term("script")],
+ [#get_term("software")],
+ [#get_term("web")],
+ [#get_term("link")],
+ [#get_term("link", capitalize: true)],
+ [#get_term("link", plural: true)],
+ [#get_term("link", capitalize: true, plural: true)],
+)
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/introduction.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/introduction.typ
new file mode 100644
index 0000000000..e08bca4fbc
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/introduction.typ
@@ -0,0 +1,110 @@
+#import "../../components.typ": *
+#import "../../packages.typ": *
+
+
+= Introdução
+
+Este projeto visa a fornecer um modelo para redação de trabalhos acadêmicos por meio da ferramenta Typst @typst:2025:typst segundo as @nbr:pl da @abnt.
+As normas a seguir são contempladas.
+
+#let nbr = glossarium.gls-short("nbr")
+
+#terms(
+ terms.item[
+ #nbr 6022:2018
+ ][
+ Informação e documentação — Artigo em publicação periódica técnica e/ou científica — Apresentação
+ ],
+ terms.item[
+ #nbr 6023:2025
+ ][
+ Informação e documentação — Referências — Elaboração
+ ],
+ terms.item[
+ #nbr 6024:2012
+ ][
+ Informação e documentação — Numeração progressiva das seções de um documento — Apresentação
+ ],
+ terms.item[
+ #nbr 6027:2012
+ ][
+ Informação e documentação — Sumário — Apresentação
+ ],
+ terms.item[
+ #nbr 6028:2021
+ ][
+ Informação e documentação — Resumo, resenha e recensão — Apresentação
+ ],
+ terms.item[
+ #nbr 6029:2023
+ ][
+ Informação e documentação — Livros e folhetos — Apresentação
+ ],
+ terms.item[
+ #nbr 6034:2004
+ ][
+ Informação e documentação — Índice — Apresentação
+ ],
+ terms.item[
+ #nbr 10520:2023
+ ][
+ Informação e documentação — Citações em documentos — Apresentação
+ ],
+ terms.item[
+ #nbr 10719:2025
+ ][
+ Informação e documentação — Relatório técnico e/ou científico — Apresentação
+ ],
+ terms.item[
+ #nbr 14724:2024
+ ][
+ Informação e documentação — Trabalhos acadêmicos — Apresentação
+ ],
+ terms.item[
+ #nbr 15287:2025
+ ][
+ Informação e documentação — Projeto de pesquisa — Apresentação
+ ],
+)
+
+
+== Requisitos
+
+É necessário instalar as seguintes fontes para que o modelo funcione corretamente.
+Caso utilize a ferramenta Typst via web, elas já estarão disponíveis.
+
+/ Liberation Sans: para títulos e demais componentes de destaque em fonte sem serifa.
+/ Liberation Serif: para o corpo do texto com fonte serifada.
+/ Liberation Mono: para trechos de código e texto em destaque com fonte mono-espaçada.
+/ New Computer Modern: para texto em blocos de equações matemáticas.
+/ New Computer Modern Math: para fórmulas e equações matemáticas.
+
+Se preferir, você pode alterar essas fontes por quaisquer outras que desejar ao modificar o bloco de abertura do modelo no arquivo `/main.typ`.
+
+
+== Ficha catalográfica
+
+A ficha catalográfica gerada por esse modelo é apenas um exemplo.
+Sua instituição provavelmente fornecerá uma página em PDF para ser anexada ao projeto.
+
+Nesse caso, coloque a página dentro da pasta `/academic_work/assets/documents`.
+Em seguida,
++ edite o arquivo `/academic_work/content/pre_textual.typ`
++ de forma a não usar o comando `include_cataloging_in_publication`,
++ mas sim o comando `include_custom_cataloging_in_publication`
++ com o caminho referente à página a incluir.
+
+
+== Referências a outros capítulos
+
+É comum encerrar a introdução fazendo uma descrição da estrutura do projeto.
+Para isso, você pode definir e chamar os rótulos (ou #foreign_text[labels]) dos capítulos e das seções.
+Esses indicativos são determinados pela @abnt @nbr 6024:2012 @abnt:2012:nbr_6024_2012.
+
+Um rótulo é aberto com o símbolo `<` e fechado com o símbolo `>`.
+Após definir o título de um capítulo ou seção, utilize os símbolos `<>` e escreve o nome do rótulo entre eles.
+
+Então, você pode utilizar o símbolo `@` para incluir uma referência para o capítulo ou seção no texto.
+
+Por exemplo, este capítulo de introdução é o @capítulo:introdução.
+Já o capítulo de fundamentação teórica é o @capítulo:fundamentação.
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/main.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/main.typ
new file mode 100644
index 0000000000..178935b033
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/main.typ
@@ -0,0 +1,16 @@
+// # Textual elements. Elementos textuais.
+// NBR 14724:2024 4.2.2
+
+#import "../../components.typ": *
+#import "../../packages.typ": *
+
+
+#include "introduction.typ"
+
+#include "foundation.typ"
+
+#include "method.typ"
+
+#include "results.typ"
+
+#include "considerations.typ"
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/method.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/method.typ
new file mode 100644
index 0000000000..f07770e0d7
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/method.typ
@@ -0,0 +1,652 @@
+#import "../../components.typ": *
+#import "../../packages.typ": *
+
+= Material e métodos
+
+
+== Citações
+
+Para incluir uma citação direta, utilize o comando `quote`.
+Ele recebe um argumento posicional.
+Devemos abrir colchetes após sua chamada e escrever dentro deles a citação.
+
+=== Citação curta
+
+A @abnt determina que uma citação curta, de até três linhas, deve ser inclusa em texto corrido.
+Para incluir uma referência nessa forma, utilize o comando `cite_prose`.
+
+==== Exemplo
+
+No livro "O que eu vi, o que nós veremos",
+#cite_prose(supplement: [p. 49], ) escreveu
+#quote[
+ Perguntar-me-á o leitor porque não o construí mais cedo, ao mesmo tempo que os meus dirigíveis
+].
+
+=== Citação longa
+
+Para citações que ocupem mais que três linhas, devemos utilizar dois argumentos na chamada do comando `quote`.
+O primeiro é o argumento `block`, que deve ser definido como `true`.
+
+Outro argumento necessário é o `attribution`, em que podemos incluir qualquer texto para descrever a fonte da citação.
+
+Nesse argumento, podemos usar uma das referências já definidas previamente na bibliografia em sua forma parentética.
+Para isso, apenas utilize o símbolo `@` antes do nome da referência.
+
+==== Exemplo
+
+#quote(
+ attribution: [@dumont:1918:o_que_eu_vi_o_que_nos_veremos[p. 49].],
+ block: true,
+)[
+ Perguntar-me-á o leitor porque não o construí mais cedo, ao mesmo tempo que os meus dirigíveis.
+ É que o inventor, como a natureza de Linneu, não faz saltos; progride de manso, evolui.
+ Comecei por fazer-me bom piloto de balão livre e só depois ataquei o problema de sua dirigibilidade.
+ Fiz-me bom aeronauta no manejo dos meus dirigíveis; durante muitos anos, estudei a fundo o motor a petróleo e só quando verifiquei que o seu estado de perfeição era bastante para fazer voar, ataquei o problema do mais pesado que o ar
+]
+
+
+== Ilustrações
+
+De acordo com a seção 5.8 da @nbr:short 14724:2024, uma ilustração se trata da
+#quote(attribution: )[
+ designação genérica de imagem, que ilustra ou elucida um texto
+].
+Incluem-se nessa categoria desenhos, esquemas, fluxogramas,
+fotografias, gráficos, mapas, organogramas, plantas, quadros, retratos, figuras e imagens #cite().
+
+Acima de cada ilustração deve constar uma legenda que descreva brevemente seu conteúdo, iniciada em letra maiúscula e sem finalização com ponto final.
+Ela deve ser precedida do termo que melhor a descreve, como "Figura", "Quadro", "Gráfico", etc., seguido de seu número sequencial #cite().
+Em geral, o Typst é capaz de identificar automaticamente o tipo de ilustração e gerar a legenda correta.
+
+Para inserir uma ilustração, deve-se utilizar o comando `figure()`.
+Ele recebe como parâmetros:
++ `caption`, a legenda da ilustração;
++ `supplement`, o termo descritor, caso o Typst não seja capaz de inferi-lo;
++ `kind`, o tipo da ilustração, caso seja não trivial, e
++ seu conteúdo;
++ além de demais parâmetros opcionais.
+
+Em seguida está um exemplo de figura.
+
+#figure(
+ caption: [
+ Ilustração composta de texto
+ ],
+ supplement: "Texto",
+ kind: "text",
+ par()[
+ Essa ilustração se trata de uma sequência de frases.\
+ Sim, uma ilustração pode ser composta de texto.\
+ Ela pode ser utilizada para ilustrar uma ideia ou conceito.
+ ],
+)
+
+O conteúdo de uma ilustração pode ser uma imagem, a qual deve ser inserida com o comando `image()`.
+Ele recebe como parâmetro obrigatório o caminho do arquivo.
+Já como opcionais elencam-se:
++ `width`: a largura, que pode ser especificada em centímetros ou em porcentagem em relação à pagina (como `50%`); e
++ `height`: a altura, que pode ser especificada da mesma forma.
+
+Abaixo está um exemplo de ilustração composta por uma imagem, com largura de 10cm e altura de 5cm.
+Ela é importada por meio do caminho relativo `./../../assets/images/black_square.png`, que deve ser ajustado de acordo com a estrutura do projeto.
+
+#figure(
+ caption: [
+ Retângulo preto
+ ],
+ image(
+ width: 10cm,
+ height: 5cm,
+ "./../../assets/images/black_square.png",
+ ),
+)
+
+=== Ambiente de descrição
+
+Todas as ilustrações devem ser citadas no texto e inseridas o mais próximo possível da sua primeira citação #cite().
+
+Para isso, deve-se atribuir um rótulo à ilustração.
+Pode-se fazê-lo abrindo aspas angulares (`<>`) após o comando `figure()`, da seguinte forma: ``.
+
+Para a ilustração abaixo, o rótulo é `figura:quadrado_preto_sem_fonte`.
+Então, para referenciá-la no texto, deve-se utilizar o comando `ref()`, que recebe como parâmetro o rótulo da ilustração.
+Alternativamente, pode-se utilizar o caractere `@` seguido do rótulo.
+
+Essa é uma referência para a #ref().
+Essa também é uma referência para a @figura:quadrado_preto_sem_fonte.
+#figure(
+ caption: [
+ Quadrado preto
+ ],
+ image(
+ "./../../assets/images/black_square.png",
+ ),
+)
+
+A @nbr:short 14724:2024 determina que todas as ilustrações apresentem sua fonte.
+Elas também podem contar com uma nota explicativa.
+Ambas as informações devem ser apresentadas após a ilustração e alinhadas à sua margem esquerda.
+Elas também devem ser apresentadas em fonte menor que a do texto principal e limitadas pela largura da ilustração #cite().
+
+Para cumprir essa exigência, devemos utilizar o ambiente `describe_figure()` em torno da ilustração.
+Esse comando recebe como parâmetros opcionais:
++ `source`: a fonte da ilustração; e
++ `note`: uma nota sobre a ilustração.
+
+Caso a fonte não seja informada, ela será automaticamente preenchida com o texto "#source_for_content_created_by_authors()".
+
+A @figura:quadrado_vermelho_com_fonte_implícita mostra o uso desses parâmetros.
+
+#describe_figure(
+ [
+ #figure(
+ caption: [
+ Quadrado vermelho com fonte implícita
+ ],
+ rect(
+ fill: red,
+ height: 5cm,
+ width: 5cm,
+ ),
+ )
+ ],
+)
+
+Caso você queira eliminar totalmente a descrição da fonte de uma imagem, defina o atributo `source` com o valor `false`, como na @figura:quadrado_vermelho_sem_fonte.
+Perceba, porém, que a @abnt exige que sempre seja descrita a fonte.
+
+#describe_figure(
+ source: false,
+ [
+ #figure(
+ caption: [
+ Quadrado vermelho sem fonte
+ ],
+ rect(
+ fill: red,
+ height: 5cm,
+ width: 5cm,
+ ),
+ )
+ ],
+)
+
+O @texto:ismália_guimarães_1960 mostra o resultado do uso do ambiente `describe_figure()` preenchendo os parâmetros de fonte e nota.
+Nesse caso, é recomendado utilizar o comando `cite_prose` para incluir uma referência da bibliografia no formato de texto-livre.
+
+#describe_figure(
+ source: [
+ #cite_prose().
+ ],
+ note: [
+ Alphonsus Guimarães foi um poeta brasileiro, conhecido por sua obra lírica e simbolista.
+ ],
+ [
+ #figure(
+ caption: [
+ Ismália
+ ],
+ supplement: "Texto",
+ kind: "text",
+
+ text()[
+ *Ismália*
+ #parbreak()
+ Quando Ismália enlouqueceu,\
+ Pôs-se na torre a sonhar...\
+ Viu uma lua no céu,\
+ Viu outra lua no mar.\
+ No sonho em que se perdeu,\
+ Banhou-se toda em luar...\
+ Queria subir ao céu,\
+ Queria descer ao mar...\
+ E, no desvario seu,\
+ Na torre pôs-se a cantar...\
+ Estava perto do céu,\
+ Estava longe do mar...\
+ E como um anjo pendeu\
+ As asas para voar...\
+ Queria a lua do céu,\
+ Queria a lua do mar...\
+ As asas que Deus lhe deu\
+ Ruflaram de par em par...\
+ Sua alma subiu ao céu,\
+ Seu corpo desceu ao mar...
+ ],
+ )
+ ],
+)
+
+Também é possível definir mais de uma nota na mesma figura.
+Para isso, basta definir o parâmetro `note` como uma lista de notas.
+Uma lista é representada com a abertura de parênteses, e cada item é separado com vírgula, como em: `(nota1, nota2)`.
+Observe o exemplo da @figura:retângulo_vermelho_com_múltiplas_notas.
+
+#describe_figure(
+ note: (
+ [
+ #lorem(5)
+ ],
+ [
+ #lorem(40)
+ ],
+ ),
+ [
+ #figure(
+ caption: [
+ Retângulo vermelho com múltiplas notas
+ ],
+ rect(
+ fill: red,
+ height: 5cm,
+ width: 100%,
+ ),
+ )
+ ],
+)
+
+=== Posicionamento
+
+Para ilustrações que ficam mal posicionadas na página, como aquelas com altura muito elevada, pode-se utilizar o parâmetro `placement: auto` no ambiente `describe_figure()`, para que o Typst escolha automaticamente uma melhor posição.
+
+A @figura:retângulo_vermelho_alto apresenta um retângulo vermelho com largura de 100% da página e altura de 20cm, com fonte de autoria e nota geradas automaticamente para ocupar mais de uma linha.
+Nela, o parâmetro `placement: auto` foi definido.
+
+#describe_figure(
+ placement: auto,
+ source: [
+ #lorem(20)
+ ],
+ note: [
+ #lorem(40)
+ ],
+ [
+ #figure(
+ caption: [
+ #lorem(25)
+ ],
+ rect(
+ fill: red,
+ height: 20cm,
+ width: 100%,
+ ),
+ )
+ ],
+)
+
+=== Sub-ilustrações
+
+Quando for necessário apresentar várias ilustrações que constituem um conteúdo único, pode-se utilizar o ambiente `subpar.super()`, que permite criar sub-ilustrações.
+
+Esse ambiente recebe como parâmetros:
++ `label`: o rótulo da ilustração;
++ `caption`: a legenda da ilustração; e
++ `grid`, que define a grade de sub-ilustrações.
+Você pode encapsular o ambiente `subpar.super()` em um `block()` com o parâmetro `sticky: true`, para que as sub-ilustrações sejam dispostas na mesma página.
+
+A @figura:três_sub-figuras apresenta três sub-ilustrações, cada uma com sua própria legenda.
+Esta é a primeira sub-ilustração: @figura:primeira_sub-figura;
+esta é a segunda sub-ilustração: @figura:segunda_sub-figura; e
+esta é a terceira sub-ilustração: @figura:terceira_sub-figura.
+
+#describe_figure(
+ source: [
+ #lorem(20)
+ ],
+ note: [
+ #lorem(40)
+ ],
+ placement: auto,
+
+ subpar.super(
+ label: ,
+ caption: [Uma figura composta de três sub-figuras],
+
+ block()[
+ #grid(
+ columns: (1fr, 1fr),
+
+ grid.cell()[
+ #figure(
+ caption: [
+ #lorem(5)
+ ],
+ image("./../../assets/images/black_square.png", width: 5cm),
+ )
+ ],
+
+ grid.cell()[
+ #figure(
+ caption: [
+ #lorem(10)
+ ],
+ image("./../../assets/images/black_square.png", width: 5cm),
+ )
+ ],
+
+ grid.cell(colspan: 2)[
+ #figure(
+ caption: [
+ #lorem(15)
+ ],
+ image("./../../assets/images/black_square.png", width: 10cm),
+ )
+ ],
+ )
+ ],
+ ),
+)
+
+=== Tipos de ilustrações
+
+A seguir estão os tipos de ilustrações mais comuns, com exemplos de cada um.
+
+==== Figura
+
+Uma figura deve ser inserida com o comando `image`, que recebe como parâmetro obrigatório o caminho do arquivo.
+
+Então, ela deve ser inserida dentro do ambiente `figure`, que, por sua vez, deve ser encapsulado no ambiente `describe_figure` para que a fonte e a nota sejam apresentadas corretamente.
+
+A @figura:quadrado_preto apresenta uma imagem importada do arquivo `./../../assets/images/black_square.png`, com largura de 10cm e altura ajustada proporcionalmente.
+
+#describe_figure(
+ [
+ #figure(
+ caption: [
+ Quadrado preto
+ ],
+ image(
+ width: 10cm,
+ "./../../assets/images/black_square.png",
+ ),
+ )
+ ],
+)
+
+==== Quadro
+
+Um quadro se trata de uma tabela fechada nas extremidades.
+Ele deve ter uma legenda iniciada com o termo "Quadro", seguido de seu número sequencial e do título.
+Para tal, deve-se utilizar no comando `figure` o parâmetro `kind: "board"` e o parâmetro `supplement: "Quadro"`.
+
+Então, o conteúdo da ilustração deve ser uma tabela, que pode ser criada com o comando `table`.
+O @quadro:exemplo_de_quadro ilustra o uso esperado.
+
+#describe_figure(
+ [
+ #figure(
+ kind: "board",
+ supplement: "Quadro",
+ caption: [
+ Exemplo de quadro
+ ],
+
+ table(
+ columns: (1fr, 1fr, 1fr),
+ align: center + horizon,
+
+ table.header(
+ table.cell()[#strong("Cabeçalho 1")],
+ table.cell()[#strong("Cabeçalho 2")],
+ table.cell()[#strong("Cabeçalho 3")],
+ ),
+
+ table.cell(
+ rowspan: 2,
+ )[Linhas 1 e 2, Coluna 1],
+ table.cell()[Linha 1, Coluna 3],
+
+ table.cell()[Linha 2, Coluna 1],
+ table.cell()[Linha 2, Coluna 2],
+ table.cell()[Linha 2, Coluna 3],
+
+ table.cell()[Linha 3, Coluna 1],
+ table.cell(
+ colspan: 2,
+ )[Linha 3, Colunas 2 e 3],
+ ),
+ )
+ ],
+)
+
+
+== Tabelas
+
+A formatação de tabelas é definida pelas Normas de apresentação tabular do @ibge #cite().
+Para inclui-las no documento, utilizamos os comandos `describe_figure` e `figure`.
+
+Dentro desse bloco, abrimos um ambiente de formatação da tabela com o comando `format_table`.
+Dentro dele, utilizamos o ambiente `table`, definido pelo Typst.
+
+A @tabela:ingredientes se trata de uma tabela simples, com poucas linhas de dados, que representa quantidades de ingredientes para uma receita de bolo de chocolate.
+
+#describe_figure(
+ note: [Não testamos essa receita.],
+ [#figure(
+ caption: "Quantidades dos ingredientes para uma receita de bolo de chocolate",
+ block(
+ width: 50%,
+ format_table(
+ table(
+ columns: (5fr, 3fr),
+ table.header([Ingrediente], [Quantidade]),
+ [Farinha de trigo], [2 xícaras],
+ [Açúcar], [1 e 1/2 xícaras],
+ [Cacau em pó], [1/2 xícara],
+ [Ovos], [3 unidades],
+ [Leite], [1 xícara],
+ [Óleo], [1/2 xícara],
+ [Fermento em pó], [1 colher de sopa],
+ ),
+ ),
+ ),
+ )],
+)
+
+
+Já a @tabela:vendas_mensais é um exemplo de tabela longa, com muitas linhas, que representa dados sintéticos de vendas mensais por região no Brasil (2023-2024).
+
+Essa tabela utilizou os comandos `table.header` para criar seu cabeçalho e `table.footer` para seu rodapé.
+Dessa forma, ambos são incluídos em todas as páginas que a tabela ocupar.
+
+#describe_figure(
+ [#figure(
+ caption: "Dados de vendas mensais por região no Brasil (2023-2024)",
+ format_table(
+ table(
+ columns: (1.25fr, 1fr, 1fr, 1fr, 1fr),
+ table.header([Região], [Mês/Ano], [Vendas (R#sym.dollar)], [Unidades], [Crescimento (%)]),
+ [Norte], [Jan/2023], [R#sym.dollar 125.430,00], [1.254], [--],
+ [Norte], [Fev/2023], [R#sym.dollar 134.567,00], [1.346], [7,3%],
+ [Norte], [Mar/2023], [R#sym.dollar 142.890,00], [1.429], [6,2%],
+ [Norte], [Abr/2023], [R#sym.dollar 138.234,00], [1.382], [-3,3%],
+ [Norte], [Mai/2023], [R#sym.dollar 156.789,00], [1.568], [13,4%],
+ [Norte], [Jun/2023], [R#sym.dollar 167.234,00], [1.672], [6,7%],
+ [Nordeste], [Jan/2023], [R#sym.dollar 234.567,00], [2.346], [--],
+ [Nordeste], [Fev/2023], [R#sym.dollar 245.890,00], [2.459], [4,8%],
+ [Nordeste], [Mar/2023], [R#sym.dollar 267.123,00], [2.671], [8,6%],
+ [Nordeste], [Abr/2023], [R#sym.dollar 278.456,00], [2.785], [4,2%],
+ [Nordeste], [Mai/2023], [R#sym.dollar 289.789,00], [2.898], [4,1%],
+ [Nordeste], [Jun/2023], [R#sym.dollar 312.345,00], [3.123], [7,8%],
+ [Centro-Oeste], [Jan/2023], [R#sym.dollar 187.654,00], [1.877], [--],
+ [Centro-Oeste], [Fev/2023], [R#sym.dollar 195.432,00], [1.954], [4,1%],
+ [Centro-Oeste], [Mar/2023], [R#sym.dollar 203.876,00], [2.039], [4,3%],
+ [Centro-Oeste], [Abr/2023], [R#sym.dollar 198.234,00], [1.982], [-2,8%],
+ [Centro-Oeste], [Mai/2023], [R#sym.dollar 214.567,00], [2.146], [8,2%],
+ [Centro-Oeste], [Jun/2023], [R#sym.dollar 225.890,00], [2.259], [5,3%],
+ [Sudeste], [Jan/2023], [R#sym.dollar 456.789,00], [4.568], [--],
+ [Sudeste], [Fev/2023], [R#sym.dollar 478.234,00], [4.782], [4,7%],
+ [Sudeste], [Mar/2023], [R#sym.dollar 495.678,00], [4.957], [3,6%],
+ [Sudeste], [Abr/2023], [R#sym.dollar 512.345,00], [5.123], [3,4%],
+ [Sudeste], [Mai/2023], [R#sym.dollar 534.567,00], [5.346], [4,3%],
+ [Sudeste], [Jun/2023], [R#sym.dollar 567.890,00], [5.679], [6,2%],
+ [Sul], [Jan/2023], [R#sym.dollar 298.765,00], [2.988], [--],
+ [Sul], [Fev/2023], [R#sym.dollar 312.456,00], [3.125], [4,6%],
+ [Sul], [Mar/2023], [R#sym.dollar 325.789,00], [3.258], [4,3%],
+ [Sul], [Abr/2023], [R#sym.dollar 334.567,00], [3.346], [2,7%],
+ [Sul], [Mai/2023], [R#sym.dollar 345.890,00], [3.459], [3,4%],
+ [Sul], [Jun/2023], [R#sym.dollar 356.234,00], [3.562], [3,0%],
+ [Norte], [Jul/2023], [R#sym.dollar 172.567,00], [1.726], [3,2%],
+ [Norte], [Ago/2023], [R#sym.dollar 165.432,00], [1.654], [-4,1%],
+ [Norte], [Set/2023], [R#sym.dollar 178.890,00], [1.789], [8,1%],
+ [Norte], [Out/2023], [R#sym.dollar 184.567,00], [1.846], [3,2%],
+ [Norte], [Nov/2023], [R#sym.dollar 192.345,00], [1.923], [4,2%],
+ [Norte], [Dez/2023], [R#sym.dollar 205.678,00], [2.057], [6,9%],
+ [Nordeste], [Jul/2023], [R#sym.dollar 323.456,00], [3.235], [3,6%],
+ [Nordeste], [Ago/2023], [R#sym.dollar 334.789,00], [3.348], [3,5%],
+ [Nordeste], [Set/2023], [R#sym.dollar 345.123,00], [3.451], [3,1%],
+ [Nordeste], [Out/2023], [R#sym.dollar 356.789,00], [3.568], [3,4%],
+ [Nordeste], [Nov/2023], [R#sym.dollar 367.234,00], [3.672], [2,9%],
+ [Nordeste], [Dez/2023], [R#sym.dollar 389.567,00], [3.896], [6,1%],
+ table.footer(
+ table.hline(stroke: 1pt),
+ table.cell(
+ align: center,
+ [Região],
+ ),
+ table.cell(
+ align: center,
+ [Mês/Ano],
+ ),
+ table.cell(
+ align: center,
+ [Vendas (R#sym.dollar)],
+ ),
+ table.cell(
+ align: center,
+ [Unidades],
+ ),
+ table.cell(
+ align: center,
+ [Crescimento (%)],
+ ),
+ ),
+ ),
+ ),
+ )],
+)
+
+
+
+== Equações
+
+Equações podem ser escritas dentro de um ambiente cercado por `$ ... $`.
+
+$ a^2 + b^2 = c^2 $
+
+Elas serão automaticamente numeradas.
+Caso deseje que uma equação não seja numerada, abra um bloco com `#[]`.
+Dentro dele, utilize o comando `set math.equation()` e defina o parâmetro `numbering: none`.
+
+#[
+ #set math.equation(numbering: none)
+ $ 1 + 1 = 2 $
+]
+
+Caso deseje inserir texto descritivo para a equação, utilize o comando `equation` para abrir um bloco.
+Esse ambiente recebe como argumento opcional `width`, para determinar a largura do bloco de equações.
+
+#equation(
+ width: 41.82%,
+)[
+ $ 1 + X = 2 $
+ - X tem o valor de 1.
+]
+
+=== Equações com rótulos
+
+Você pode atribuir rótulos a uma equação para citá-la no texto.
+Por exemplo, essa é a @equação:teorema_pitagórico e essa é a @equação:número_triangular.
+
+#equation(
+ width: 75%,
+)[
+ Sejam $a$, $b$ e $c$ o comprimento dos lados de um triângulo retângulo.
+ Então, sabemos que:
+ $ a^2 + b^2 = c^2 $
+
+ Prove por indução:
+ $ sum_(k=1)^n k = (n(n+1)) / 2 $
+]
+
+=== Esquemas
+
+Além disso, caso deseje dar mais destaque a uma equação, você pode usar os comandos `describe_figure` e `figure` para criar um esquema de equações.
+
+Nessa caso, defina os seguinte atributos para o comando `figure`: `supplement: "Esquema"` e `kind: "scheme"`.
+Veja o exemplo do @esquema:soma.
+
+#describe_figure(
+ // placement: auto,
+)[
+ #figure(
+ supplement: "Esquema",
+ kind: "scheme",
+ caption: [
+ Soma entre dois números.
+ ],
+ )[
+ #equation(
+ width: 41.82%,
+ )[
+ $ 1 + 1 = 2 $
+ ]
+ ]
+]
+
+== Sub-equações
+
+Caso você queira dividir uma equação em partes diferentes, numeradas com o mesmo índice principal, você pode utilizar o pacote `equate`.
+
+Ele fornece um ambiente de mesmo nome, `equate`, e apresenta um parâmetro chamado `sub-numbering`, que deve ser preenchido como `true`.
+
+Dentro desse ambiente, você pode quebrar a equação em diferentes linhas usado o caractere `\` (contra-barra).
+Cada linha receberá um sub-índice diferente de forma incremental.
+
+Caso você, por acaso, queira exibir o símbolo de contra-barra no documento final, basta digitá-lo duas vezes em seguida, como `\\`.
+Isso será interpretado pelo Typst como apenas um `\` que se deseja exibir.
+
+Esses ambientes são exemplificados pelo @esquema:uct_adaptada abaixo, que é composto pela @equação:uct_adaptada e sua descrição.
+
+#describe_figure(
+ // placement: auto,
+ source: [
+ adaptado de
+ #cite_prose(
+ supplement: [p. 2505],
+ ,
+ )
+ #cite_prose(supplement: [p. 486], ).
+ ],
+)[
+ #figure(
+ supplement: "Esquema",
+ kind: "scheme",
+ caption: [
+ Cálculo de @fitness da diretriz de @uct usada pela @mcts adaptada pelo @alphazero
+ ],
+ )[
+ #equation[
+ #equate.equate(
+ sub-numbering: true,
+ )[
+ $
+ m^* = max(m in M(s)) = Q(s,m) + X(s,m)\
+ X(s,m) = C times
+ P(s,m) / (V(s,m) + 1)
+ $
+
+ Na qual:
+ - $m^*$ é o nó que representa o @movimento ótimo selecionado pela diretriz;
+ - $M(s)$ é o conjunto de nós que representam os @movimento:pl válidos a partir do @estado $s$, segundo as regras do @jogo;
+ - $Q(s,m)$ é a qualidade da @partida calculada por meio de simulações ao jogar o @movimento $m$ no @estado $s$;
+ - $X(s,m)$ é o componente de @exploração (#glossarium.gls-custom("exploração")) calculado ao jogar o @movimento $m$ no @estado $s$;
+ - $V(s)$ é quantidade de vezes em que o nó que guarda o @estado $s$ foi visitado nas iterações anteriores;
+ - $V(s,m)$ é a quantidade de vezes em que o nó que representa o @movimento $m$ foi visitado nas interações anteriores;
+ - $P(s,m)$ é a qualidade previamente atribuída pelo modelo de @resnet para jogar o @movimento $m$ no estado $s$;
+ - $C$ é o coeficiente que regula a relação entre @exploração e @aproveitamento.
+ ]
+ ]
+ ]
+]
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/results.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/results.typ
new file mode 100644
index 0000000000..775214ab7b
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/content/textual/results.typ
@@ -0,0 +1,58 @@
+#import "../../components.typ": *
+#import "../../packages.typ": *
+
+= Resultados
+
+
+== Alíneas
+
+Alíneas são uma forma de dividir um parágrafo em diferentes itens em uma lista.
+A @abnt determina que o texto anterior a uma alínea, que apresenta o seu contexto, deve ser finalizado com o sinal de "dois pontos", `:`.
+
+A forma mais simples de utilizar alíneas é digitar o símbolo `+` antes de cada uma das linhas, como apresentado a seguir:
+
++ as alíneas devem ser iniciadas em letra minúscula;
++ cada linha deve ser finalizada em "ponto e vírgula";
++ este é um exemplo de uma alínea muito longa; o texto das próximas linhas que se formam fica alinhado exatamente abaixo da primeira letra do texto da linha superior;
++ A última linha deve ser finalizada em "ponto final".
+
+Uma linha pode apresentar subalíneas.
+A alínea que apresentará o contexto da subalínea deve finalizar em "dois pontos", como mostrado a seguir:
+
++ alínea 1:
+ + subalínea 1;
+ + subalínea 2;
++ alínea 2.
+
+
+== Notas de rodapé
+
+Para incluir uma nota de rodapé, utilize o comando `footnote`.
+Basta então descrever o conteúdo dentro dos colchetes.
+A nota aparecerá no rodapé da página em que for inclusa.
+
+Um uso frequente para notas de rodapé é citar páginas na web.
+//
+Por exemplo, citemos a página do Typst
+#footnote[
+ Typst é uma ferramenta para criação de documentos similar ao LaTeX.
+ Acesso em:
+ #link("https://typst.app/").
+].
+//
+Também podemos utilizar notas de rodapé para descrever com mais detalhes um assunto citado
+#footnote[
+ Vamos incluir uma nota com várias linhas.
+ #lorem(50)
+].
+
+
+== Texto mono-espaçado
+
+Para inserir texto mono-espaçado, abra um bloco usando o caractere ``` ` ``` três vezes, como a seguir: ```` ``` ````.
+
+```
+Lorem ipsum dolor sit amet, consectetur adipiscing elit,
+sed do eiusmod tempor incididunt ut labore et dolore magnam
+aliquam quaerat voluptatem.
+```
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/data/bibliography.bib b/packages/preview/quati-abnt/0.1.0/template/academic_work/data/bibliography.bib
new file mode 100644
index 0000000000..ef0e4620fc
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/data/bibliography.bib
@@ -0,0 +1,161 @@
+@book{abnt:2012:nbr_6024_2012,
+ address = {Rio de Janeiro, RJ, Brasil},
+ date = {2025-02-01},
+ edition = {2},
+ editor = {{Associação Brasileira de Normas Técnicas}},
+ org-short = {ABNT},
+ pages = {4},
+ publisher = {Associação Brasileira de Normas Técnicas},
+ title = {ABNT NBR 6024:2012: Informação e documentação --- Numeração progressiva das seções de um documento --- Apresentação},
+}
+
+@book{abnt:2025:nbr_14724_2024,
+ address = {Rio de Janeiro, RJ, Brasil},
+ date = {2025-04-01},
+ edition = {4},
+ editor = {{Associação Brasileira de Normas Técnicas}},
+ org-short = {ABNT},
+ pages = {12},
+ publisher = {Associação Brasileira de Normas Técnicas},
+ title = {ABNT NBR 14724:2024: Informação e documentação --- Trabalhos acadêmicos --- Apresentação},
+}
+
+@book{dumont:1918:o_que_eu_vi_o_que_nos_veremos,
+ address = {São Paulo},
+ author = {Dumont, Alberto Santos},
+ edition = {1},
+ publisher = {Wikisource},
+ title = {O que eu vi, o que nós veremos},
+ url = {https://pt.wikisource.org/wiki/O_que_eu_vi,_o_que_n%C3%B3s_veremos},
+ urldate = {2025-08-02},
+ year = {1918},
+}
+
+@online{geeksforgeeks:2025:machine_learning_algorithms,
+ author = {{GeeksforGeeks}},
+ date = {2025-11-18},
+ publisher = {{GeeksforGeeks}},
+ title = {Machine Learning Algorithms},
+ url = {https://www.geeksforgeeks.org/machine-learning/machine-learning-algorithms/},
+ urldate = {2026-01-12},
+}
+
+@inbook{guimaraes:1960:ismalia,
+ address = {Rio de Janeiro, RJ, Brasil},
+ author = {Guimarães, Alphonsus de},
+ booktitle = {Obra Completa},
+ pages = {231-232},
+ publisher = {José Aguilar},
+ title = {Ismália},
+ urldate = {2025-08-06},
+ year = {1960},
+}
+
+@book{ibge:1993:normas_apresentacao_tabular,
+ address = {Rio de Janeiro, RJ, Brasil},
+ edition = {3},
+ editor = {{Instituto Brasileiro de Geografia e Estatística}},
+ pages = {63},
+ publisher = {{Centro de Documentação e Disseminação de Informações, Fundação Instituto Brasileiro de Geografia e Estatística}},
+ title = {Normas de apresentação tabular},
+ urldate = {2025-08-03},
+ year = {1993},
+}
+
+@book{ibge:2023:manual_elaboracao_trabalhos,
+ address = {Rio de Janeiro, RJ, Brasil},
+ editor = {{Instituto Brasileiro de Geografia e Estatística}},
+ publisher = {{Escola Nacional de Ciências Estatísticas, Instituto Brasileiro de Geografia e Estatística}},
+ title = {Manual para a Elaboração e Normalização de Trabalhos de Conclusão de Curso},
+ url = {https://ence.ibge.gov.br/images/ence/doc/especializacao/Formularios_e_procedimentos/Manual_TCC_2023.pdf},
+ year = {2023},
+}
+
+@inproceedings{kocsis:2006:bandit_based_mcts_planning,
+ abstract = {For large state-space Markovian Decision Problems Monte-Carlo planning is one of the few viable approaches to find near-optimal solutions. In this paper we introduce a new algorithm, UCT, that applies bandit ideas to guide Monte-Carlo planning. In finite-horizon or discounted MDPs the algorithm is shown to be consistent and finite sample bounds are derived on the estimation error due to sampling. Experimental results show that in several domains, UCT is significantly more efficient than its alternatives.},
+ address = {Berlin, Heidelberg},
+ author = {Kocsis, Levente
+ and Szepesvári, Csaba},
+ booktitle = {Machine Learning: ECML 2006},
+ doi = {10.1007/11871842_29},
+ editor = {Fürnkranz, Johannes
+ and Scheffer, Tobias
+ and Spiliopoulou, Myra},
+ isbn = {978-3-540-46056-5},
+ pages = {282--293},
+ publisher = {Springer Berlin Heidelberg},
+ title = {Bandit Based Monte-Carlo Planning},
+ urldate = {2026-01-07},
+ year = {2006},
+}
+
+
+@article{li:2022:survey_convolutional_neural_networks,
+ author = {Li, Zewen and Liu, Fan and Yang, Wenjie and Peng, Shouheng and Zhou, Jun},
+ doi = {10.1109/TNNLS.2021.3084827},
+ journal = {IEEE Transactions on Neural Networks and Learning Systems},
+ keywords = {Convolutional neural networks;Feature extraction;Neurons;Deep learning;Computer vision;Computer vision;convolutional neural networks (CNNs);deep learning;deep neural networks},
+ number = {12},
+ pages = {6999-7019},
+ title = {A Survey of Convolutional Neural Networks: Analysis, Applications, and Prospects},
+ url = {https://doi.org/10.1109/TNNLS.2021.3084827},
+ urldate = {2025-01-31},
+ volume = {33},
+ year = {2022},
+}
+
+
+@article{silver:2016:mastering_game_go,
+ author = {Silver, David and Huang, Aja and Maddison, Chris J. and Guez, Arthur and Sifre, Laurent and Van Den Driessche, George and Schrittwieser, Julian and Antonoglou, Ioannis and Panneershelvam, Veda and Lanctot, Marc and Dieleman, Sander and Grewe, Dominik and Nham, John and Kalchbrenner, Nal and Sutskever, Ilya and Lillicrap, Timothy and Leach, Madeleine and Kavukcuoglu, Koray and Graepel, Thore and Hassabis, Demis},
+ date = {2016-01},
+ doi = {10.1038/nature16961},
+ issn = {0028-0836, 1476-4687},
+ journal = {Nature},
+ langid = {english},
+ number = {7587},
+ pages = {484--489},
+ title = {Mastering the Game of {{Go}} with Deep Neural Networks and Tree Search},
+ url = {https://doi.org/10.1038/nature16961},
+ urldate = {2023-09-16},
+ volume = {529},
+}
+
+
+@article{suits:1967:what_is_a_game,
+ abstract = {By means of a critical examination of a number of theses as to the nature of game-playing, the following definition is advanced: To play a game is to engage in activity directed toward bringing about a specific state of affairs, using only means permitted by specific rules, where the means permitted by the rules are more limited in scope than they would be in the absence of the rules, and where the sole reason for accepting such limitation is to make possible such activity.},
+ author = {Suits, Bernard},
+ doi = {10.1086/288138},
+ journal = {Philosophy of Science},
+ number = {2},
+ pages = {148–156},
+ title = {What is a Game?},
+ url = {https://doi.org/10.1086/288138},
+ urldate = {2025-01-31},
+ volume = {34},
+ year = {1967},
+}
+
+
+@article{swiechowski:2022:monte_carlo_tree_search,
+ author = {{\'{S}}wiechowski, Maciej and Konrad Godlewski and Bartosz Sawicki and Jacek Ma{\'{n}}dziuk},
+ date = {2022-07},
+ doi = {10.1007/s10462-022-10228-y},
+ journal = {Artificial Intelligence Review},
+ number = {3},
+ pages = {2497--2562},
+ publisher = {Springer Science and Business Media {LLC}},
+ title = {Monte Carlo Tree Search: a review of recent modifications and applications},
+ url = {https://doi.org/10.1007%2Fs10462-022-10228-y},
+ urldate = {2023-09-16},
+ volume = {56},
+}
+
+
+@online{typst:2025:typst,
+ editor = {{Typst}},
+ publisher = {GitHub},
+ title = {Repositório do projeto Typst},
+ url = {https://github.com/typst/typst},
+ urldate = {2025-08-02},
+ year = {2025},
+}
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/data/data.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/data/data.typ
new file mode 100644
index 0000000000..30c4493aca
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/data/data.typ
@@ -0,0 +1,263 @@
+// # Academic Work Metadata. Metadados para Trabalho Acadêmico.
+// This file contains metadata for an academic work, such as a thesis or dissertation.
+// For the optional fields, you can leave them empty or comment the square brackets.
+
+// Title — required.
+// Título — obrigatório.
+#let title = {
+ [Guia de redação]
+}
+
+// Subtitle — optional.
+// Subtítulo — opcional.
+#let subtitle = {
+ [trabalho acadêmico]
+}
+
+// Authors — required.
+// Autores — obrigatório.
+#let authors = (
+ (
+ first_name: [Gabriel],
+ middle_name: none,
+ last_name: [Malosto],
+ gender: "m",
+ ),
+ (
+ first_name: [Alice],
+ middle_name: [de Exemplo],
+ last_name: [Almeida],
+ gender: "f",
+ ),
+)
+
+// Advisors — required.
+// Orientadores — obrigatório.
+#let advisors = (
+ (
+ first_name: [Maria],
+ middle_name: [de],
+ last_name: [Medeiros],
+ gender: "f",
+ prefix: [Prof.ª Dr.ª],
+ organization: (
+ name: [Universidade Federal de Juiz de Fora],
+ gender: "f",
+ ),
+ ),
+ (
+ first_name: [João],
+ middle_name: none,
+ last_name: [Jimenez],
+ gender: "m",
+ prefix: [Prof. Dr.],
+ organization: (
+ name: [Universidade Federal de Juiz de Fora],
+ gender: "f",
+ ),
+ ),
+ (
+ first_name: [Ana Paula],
+ middle_name: none,
+ last_name: [Andrade],
+ gender: "f",
+ prefix: [Prof.ª Dr.ª],
+ organization: (
+ name: [Instituto Federal de Educação, Ciência e Tecnologia do Sudeste de Minas Gerais],
+ gender: "m",
+ ),
+ ),
+)
+
+// Examination committee — required.
+// Banca examinadora — obrigatório.
+#let examination_committee = (
+ (
+ first_name: [Luciano],
+ middle_name: [de],
+ last_name: [Lopes],
+ gender: "m",
+ prefix: [Prof. Dr.],
+ organization: (
+ name: [Universidade Federal de Minas Gerais],
+ gender: "f",
+ ),
+ ),
+ (
+ first_name: [Renata],
+ middle_name: none,
+ last_name: [Ribeiro],
+ gender: "f",
+ prefix: [Prof.ª Dr.ª],
+ organization: (
+ name: [Universidade Federal de Juiz de Fora],
+ gender: "f",
+ ),
+ ),
+)
+
+// Organization — required. Usually the name of the university.
+// Organização — obrigatório. Geralmente o nome da universidade.
+#let organization = (
+ name: [Universidade Federal de Juiz de Fora],
+ gender: "f",
+)
+
+// Institution — optional. Usually the name of the college or faculty.
+// Instituição — opcional. Geralmente o nome da faculdade ou instituto.
+#let institution = (
+ name: [Instituto de Ciências Exatas],
+ gender: "m",
+)
+
+// Department — optional.
+// Departamento — opcional.
+#let department = (
+ name: [Departamento de Ciência da Computação],
+ gender: "m",
+)
+
+// Program — semi-optional. The name of the program or course.
+// It will be used in the nature of the work as follows: "apresentado ao Bacharelado em Sistemas de Informação".
+// You can leave it empty if you define a custom nature of the work.
+//
+// Programa — semi-opcional. O nome do programa ou curso.
+// Será usado na natureza do trabalho como segue: "apresentado ao Bacharelado em Sistemas de Informação".
+// Você pode deixá-lo vazio se definir uma natureza personalizada do trabalho.
+#let program = {
+ (
+ name: [Bacharelado em Sistemas de Informação],
+ // name: [Programa de Pós-Graduação em Ciência da Computação]
+ gender: "m",
+ )
+}
+
+// Type of work — required. The type of academic work, such as "trabalho de conclusão de curso", "dissertação", or "tese".
+// Tipo de trabalho — obrigatório. O tipo de trabalho acadêmico, como "trabalho de conclusão de curso", "dissertação" ou "tese".
+#let type_of_work = {
+ (
+ name: "trabalho de conclusão de curso",
+ gender: "m",
+ )
+ // (
+ // name: "dissertação",
+ // gender: "f",
+ // )
+ // (
+ // name: "tese",
+ // gender: "f",
+ // )
+}
+
+// Degree — semi-optional. The degree being pursued, such as "bacharelado", "especialização", etc.
+// Uncomment the desired degree around parentheses and comment the others.
+// You can leave it empty if you define a custom nature of the work.
+//
+// Grau — semi-opcional. O grau que está sendo cursado, como "bacharelado", "especialização", etc.
+// Remova a marcação de comentário do grau desejado entre parênteses e comente os outros.
+// Você pode deixá-lo vazio se definir uma natureza personalizada do trabalho.
+#let degree = (
+ // Bacharelado
+ (
+ name: "bacharelado",
+ title: (
+ masculine: "bacharel",
+ feminine: "bacharela",
+ ),
+ )
+ // Especialização
+ // (
+ // name: "especialização",
+ // title: (
+ // masculine: "especialista",
+ // feminine: "especialista",
+ // ),
+ // )
+ // Licenciatura
+ // (
+ // name: "licenciatura",
+ // title: (
+ // masculine: "licenciado",
+ // feminine: "licenciada",
+ // ),
+ // )
+ // Mestrado
+ // (
+ // name: "mestrado",
+ // title: (
+ // masculine: "mestre",
+ // feminine: "mestra",
+ // ),
+ // )
+ // Doutorado
+ // (
+ // name: "doutorado",
+ // title: (
+ // masculine: "doutor",
+ // feminine: "doutora",
+ // ),
+ // )
+)
+
+// Degree topic — required. The specific topic of which the degree is about.
+// It will be used in the nature of the work as follows: "título de bacharel em Sistemas de Informação".
+// You can leave it empty if you define a custom nature of the work.
+//
+// Tópico do curso — obrigatório. O tópico específico sobre o qual o curso versa.
+// Será usado na natureza do trabalho como segue: "título de bacharel em Sistemas de Informação".
+// Você pode deixá-lo vazio se definir uma natureza personalizada do trabalho.
+#let degree_topic = {
+ [Sistemas de Informação]
+}
+
+// Area of concentration — optional.
+// It will be used in the nature of the work as follows: "Área de concentração: Engenharia de Software".
+//
+// Área de concentração — opcional.
+// Será usado na natureza do trabalho como segue: "Área de concentração: Engenharia de Software".
+#let area_of_concentration = {
+ // [Engenharia de Software]
+}
+
+// Address — required. The city where the work is being published.
+// Endereço — obrigatório. A cidade onde o trabalho está sendo publicado.
+#let address = {
+ // If needed, add the state as in [Juiz de Fora, MG]
+ // Se necessário, adicione o estado como em [Juiz de Fora, MG]
+ [Juiz de Fora]
+}
+
+// Year — required. The year of publication.
+// Ano — obrigatório. O ano de publicação.
+#let year = {
+ [2026]
+}
+
+// Volume number — optional. If the work is part of a series or collection, specify the volume number.
+// Número do volume — opcional. Se o trabalho fizer parte de uma série ou coleção, especifique o número do volume.
+#let volume_number = {
+ // [1]
+}
+
+// Approval date — required.
+// Data de aprovação — obrigatório.
+#let approval_date = {
+ (
+ day: [01],
+ month: [janeiro],
+ year: [2026],
+ )
+}
+
+// Custom nature of the work — optional.
+// If you want to customize the nature of the work, you can do it here.
+// If you leave it empty, the default nature will be used.
+//
+// Natureza personalizada do trabalho — opcional.
+// Se você quiser personalizar a natureza do trabalho, pode fazê-lo aqui.
+// Se você deixá-la vazia, a natureza padrão será usada.
+#let custom_nature = {
+ // [
+ // Trabalho apresentado ao Bacharelado em Sistemas de Informação da Universidade Federal de Juiz de Fora como requisito parcial para a aprovação na disciplina de Sistemas de Apoio à Decisão.
+ // ]
+}
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/data/glossary.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/data/glossary.typ
new file mode 100644
index 0000000000..3fd2827674
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/data/glossary.typ
@@ -0,0 +1,192 @@
+// # Glossary. Glossário.
+
+#import "../components.typ": *
+
+
+// ## Abbreviations. Abreviaturas.
+// NBR 14724:2024 4.2.1.11
+
+#let abbreviations_entries = (
+ (
+ key: "ibge",
+ short: "IBGE",
+ long: "Instituto Brasileiro de Geografia e Estatística",
+ group: "Normatização",
+ ),
+ (
+ key: "abnt",
+ short: "ABNT",
+ long: "Associação Brasileira de Normas Técnicas",
+ group: "Normatização",
+ ),
+ (
+ key: "nbr",
+ short: "NBR",
+ plural: "NBRs",
+ long: "Norma Brasileira",
+ longplural: "Normas Brasileiras",
+ group: "Normatização",
+ ),
+ (
+ key: "ia",
+ short: "IA",
+ long: "Inteligência Artificial",
+ group: "Computação",
+ ),
+ (
+ key: "bi",
+ short: "BI",
+ long: [#foreign_text[Business Intelligence]],
+ description: "Em português, Inteligência de Negócios.",
+ group: "Computação",
+ ),
+ (
+ key: "mcts",
+ short: "MCTS",
+ long: "busca em árvore de Monte Carlo",
+ group: "Computação",
+ ),
+ (
+ key: "uct",
+ short: "UCT",
+ long: "limite superior de confiança aplicado a árvores",
+ longplural: "limites superiores de confiança aplicados a árvores",
+ custom: foreign_text[Upper Confidence bounds applied to Trees],
+ group: "Computação",
+ ),
+ (
+ key: "resnet",
+ short: "ResNet",
+ plural: "ResNets",
+ long: "rede neural residual",
+ longplural: "redes neurais residuais",
+ group: "Computação",
+ ),
+)
+
+
+// ## Glossary. Glossário.
+// NBR 14724:2024 4.2.3.2
+
+#let glossary_entries = (
+ (
+ key: "firewall",
+ short: "firewall",
+ description: "Dispositivo de segurança de rede que monitora e controla o tráfego de entrada e saída com base em regras de segurança predefinidas.",
+ group: "Computação",
+ ),
+ (
+ key: "aprendizado_maquina",
+ short: [aprendizado de máquina],
+ custom: foreign_text[machine learning],
+ description: [Em inglês, #foreign_text[machine learning]. Área da @ia que desenvolve algoritmos capazes de aprender padrões a partir de dados sem programação explícita, melhorando seu desempenho através da experiência @geeksforgeeks:2025:machine_learning_algorithms.],
+ group: "Computação",
+ ),
+ (
+ key: "fitness",
+ short: foreign_text[fitness],
+ plural: foreign_text[fitnesses],
+ custom: [avaliação],
+ description: [Em português, avaliação. Métrica que quantifica a qualidade de uma solução em relação aos objetivos, atribuindo um valor numérico que orienta a tomada de decisão ou o processo de aprendizado.],
+ group: "Computação",
+ ),
+ (
+ key: "exploração",
+ short: [exploração],
+ plural: [explorações],
+ custom: foreign_text[exploration],
+ description: [Em inglês #foreign_text[exploration]. Componente do critério @uct na @mcts que prioriza nós pouco visitados, ampliando a busca e evitando convergir cedo demais @kocsis:2006:bandit_based_mcts_planning.],
+ group: "Computação",
+ ),
+ (
+ key: "aproveitamento",
+ short: [aproveitamento],
+ plural: [aproveitamentos],
+ custom: [exploitation],
+ description: [Em inglês, #foreign_text[exploitation]. Componente do critério @uct na @mcts que favorece nós com maior valor médio estimado, aproveitando recompensas já observadas para guiar a seleção @kocsis:2006:bandit_based_mcts_planning.],
+ group: "Computação",
+ ),
+ (
+ key: "rn",
+ short: "rede neural",
+ plural: "redes neurais",
+ custom: foreign_text[neural network],
+ description: [Em inglês, #foreign_text[neural network]. Modelo computacional composto por camadas de unidades interligadas que aprendem padrões em dados por meio de ajustes de pesos @li:2022:survey_convolutional_neural_networks.],
+ group: "Computação",
+ ),
+ (
+ key: "alphazero",
+ short: foreign_text[AlphaZero],
+ description: [Algoritmo de autoaprendizado por reforço que combina @mcts e @resnet:pl profundas para dominar jogos de tabuleiro, desenvolvido pelo laboratório Google DeepMind @silver:2018:general_reinforcement_learning_algorithm.],
+ group: "Computação",
+ ),
+ (
+ key: "casa",
+ short: "casa",
+ plural: "casas",
+ custom: foreign_text[slot],
+ description: [Em inglês, #foreign_text[slot]. Unidade discreta que compõe o tabuleiro e pode conter peças ou recursos.],
+ group: "Jogos",
+ ),
+ (
+ key: "estado",
+ short: "estado",
+ plural: "estados",
+ custom: foreign_text[state],
+ description: [Em inglês, #foreign_text[state]. Representação completa da situação do @jogo em um instante, incluindo o conteúdo das @casa:pl, os recursos, a @pontuacao dos @jogador:pl e demais condições vigentes.],
+ group: "Jogos",
+ ),
+ (
+ key: "jogo",
+ short: "jogo",
+ plural: "jogos",
+ custom: foreign_text[game],
+ description: [Em inglês, #foreign_text[game]. Sistema de regras que define objetivos, @jogador:pl, @movimento:pl e condições de vitória ou encerramento @suits:1967:what_is_a_game.],
+ group: "Jogos",
+ ),
+ (
+ key: "jogador",
+ short: "jogador",
+ plural: "jogadores",
+ custom: foreign_text[player],
+ description: [Em inglês, #foreign_text[player]. Participante que toma decisões e executa @movimento:pl conforme as regras do @jogo.],
+ group: "Jogos",
+ ),
+ (
+ key: "movimento",
+ short: "movimento",
+ plural: "movimentos",
+ custom: foreign_text[move],
+ description: [Em inglês, #foreign_text[move]. Ação tomada a partir de um @estado que altera as condições atuais, levando a um novo @estado.],
+ group: "Jogos",
+ ),
+ (
+ key: "partida",
+ short: "partida",
+ plural: "partidas",
+ custom: foreign_text[match],
+ description: [Em inglês, #foreign_text[match]. Sessão completa do @jogo, iniciando nas condições iniciais e terminando quando uma condição de fim é atingida.],
+ group: "Jogos",
+ ),
+ (
+ key: "pontuacao",
+ short: "pontuação",
+ plural: "pontuações",
+ custom: foreign_text[score],
+ description: [Em inglês, #foreign_text[score]. Valor que indica o desempenho de um @jogador segundo as regras do @jogo.],
+ group: "Jogos",
+ ),
+)
+
+
+// ## Symbols. Símbolos.
+// NBR 14724:2024 4.2.1.12
+
+#let symbols_entries = (
+ (
+ key: "emptyset",
+ short: $#sym.emptyset$,
+ long: "Conjunto vazio",
+ description: "Conjunto que não contém nenhum elemento.",
+ ),
+)
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/data/terms.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/data/terms.typ
new file mode 100644
index 0000000000..230391b7c4
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/data/terms.typ
@@ -0,0 +1,45 @@
+// # Terms. Termos.
+
+#import "../packages.typ": quati-abnt.common.components.foreign_text, quati-abnt.common.components.get_term_in_list
+
+
+// ## Definition. Definição.
+#let terms_entries = (
+ (
+ key: "link",
+ short: foreign_text[link],
+ short_capitalized: foreign_text[Link],
+ plural: foreign_text[links],
+ plural_capitalized: foreign_text[Links],
+ ),
+ (
+ key: "script",
+ short: foreign_text[script],
+ plural: foreign_text[scripts],
+ ),
+ (
+ key: "software",
+ short: foreign_text[software],
+ ),
+ (
+ key: "web",
+ short: foreign_text[web],
+ ),
+)
+
+
+// ## Access. Acesso.
+#let get_term = (
+ capitalize: false,
+ field: "short",
+ plural: false,
+ term_key,
+) => {
+ get_term_in_list(
+ capitalize: capitalize,
+ field: field,
+ plural: plural,
+ terms_entries: terms_entries,
+ term_key,
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/main.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/main.typ
new file mode 100644
index 0000000000..7c053e8c59
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/main.typ
@@ -0,0 +1,63 @@
+// # Academic Work. Trabalho Acadêmico.
+// NBR 14724:2024
+
+#import "components.typ": *
+#import "data/glossary.typ": abbreviations_entries, glossary_entries, symbols_entries
+#import "packages.typ": *
+
+
+// ## Glossary. Glossário.
+#show: glossarium.make-glossary
+#glossarium.register-glossary(abbreviations_entries)
+#glossarium.register-glossary(symbols_entries)
+#glossarium.register-glossary(glossary_entries)
+
+
+// ## Template. Modelo.
+#show: it => quati-abnt.academic_work.template(
+ it,
+
+ // Define the color of links and cross-references.
+ // Defina a cor dos links e das referências cruzadas.
+ color_of_links: quati-abnt.common.style.color_of_links,
+
+ // Define the font family to be used on each context.
+ // Defina a família tipográfica a ser utilizada em cada contexto.
+ font_family_for_common_text: quati-abnt.common.style.font_family_serif,
+ font_family_for_highlighted_text: quati-abnt.common.style.font_family_sans,
+ font_family_for_math_text: quati-abnt.common.style.font_family_math,
+ font_family_for_monospaced_text: quati-abnt.common.style.font_family_mono,
+ font_family_for_editor_notes: quati-abnt.common.style.font_family_sans,
+
+ // Define whether to use larger text as typographic highlight instead of uppercase.
+ // Defina se deve ser utilizada uma fonte maior como destaque tipográfico em vez de caixa-alta.
+ should_use_larger_text_to_highlight: false,
+
+ // Define whether to format for electronic file only (true), or to print (false).
+ // Defina se deve usar a formatação para apenas arquivos eletrônicos (true), ou para a impressão (false).
+ should_consider_only_odd_pages: true,
+
+ // Define whether to count pages and place its numbers at the headers.
+ // Defina se deve contar as páginas e exibir seus números nos cabeçalhos.
+ should_number_pages: true,
+
+ // Define whether to display editor notes.
+ // Defina se deve exibir as notas de editor.
+ should_display_editor_notes: true,
+)
+
+
+// ## External elements. Elementos externos.
+#include "./content/external.typ"
+
+// ## Pre-textual elements. Elementos pré-textuais.
+#include "./content/pre_textual.typ"
+
+// ## Textual elements. Elementos textuais.
+#include "./content/textual/main.typ"
+
+// ## Bibliography. Referências.
+#bibliography("./data/bibliography.bib")
+
+// # Post-textual elements. Elementos pós-textuais.
+#include "./content/post_textual.typ"
diff --git a/packages/preview/quati-abnt/0.1.0/template/academic_work/packages.typ b/packages/preview/quati-abnt/0.1.0/template/academic_work/packages.typ
new file mode 100644
index 0000000000..61af1725e6
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/academic_work/packages.typ
@@ -0,0 +1,6 @@
+// # Packages. Pacotes.
+
+#import "@preview/quati-abnt:0.1.0" as quati-abnt
+#let glossarium = quati-abnt.common.packages.glossarium
+#import "@preview/subpar:0.2.2" as subpar
+#import "@preview/equate:0.3.3" as equate
diff --git a/packages/preview/quati-abnt/0.1.0/template/article/assets/images/black_square.png b/packages/preview/quati-abnt/0.1.0/template/article/assets/images/black_square.png
new file mode 100644
index 0000000000..2744a9f8b0
Binary files /dev/null and b/packages/preview/quati-abnt/0.1.0/template/article/assets/images/black_square.png differ
diff --git a/packages/preview/quati-abnt/0.1.0/template/article/components.typ b/packages/preview/quati-abnt/0.1.0/template/article/components.typ
new file mode 100644
index 0000000000..3b60f40dae
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/article/components.typ
@@ -0,0 +1,64 @@
+// # Components. Componentes.
+
+#import "./data/terms.typ": get_term
+#import "./packages.typ": (
+ quati-abnt.article.components.print_people, quati-abnt.article.components.print_person,
+ quati-abnt.common.components.cite_prose, quati-abnt.common.components.closed_discussion_note,
+ quati-abnt.common.components.create_status_note, quati-abnt.common.components.describe_figure,
+ quati-abnt.common.components.done_note, quati-abnt.common.components.editor_note,
+ quati-abnt.common.components.equation, quati-abnt.common.components.foreign_text,
+ quati-abnt.common.components.format_table, quati-abnt.common.components.open_discussion_note,
+ quati-abnt.common.components.progress_note, quati-abnt.common.components.source_for_content_created_by_authors,
+ quati-abnt.common.components.todo_note,
+)
+
+
+// ## Editor notes. Notas de editor.
+
+#let review_note = (
+ prefixes: none,
+ it,
+) => {
+ let color = oklch(82.01%, 0.159, 323.15deg)
+ create_status_note(
+ fill: color,
+ prefixes: prefixes,
+ status: "REVISAR",
+ stroke: color.saturate(50%),
+ it,
+ )
+}
+
+#let note_from_alice = (
+ note: editor_note,
+ it,
+) => {
+ let color = oklch(85%, 0.097, 19.33deg)
+ note(
+ prefixes: (
+ (
+ body: "Alice",
+ fill: color,
+ stroke: color.saturate(25%),
+ ),
+ ),
+ it,
+ )
+}
+
+#let note_from_gabriel = (
+ note: editor_note,
+ it,
+) => {
+ let color = oklch(80.43%, 0.1, 278.25deg)
+ note(
+ prefixes: (
+ (
+ fill: color,
+ body: "Gabriel",
+ stroke: color.saturate(25%),
+ ),
+ ),
+ it,
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/template/article/content/post_textual.typ b/packages/preview/quati-abnt/0.1.0/template/article/content/post_textual.typ
new file mode 100644
index 0000000000..54286fbc9b
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/article/content/post_textual.typ
@@ -0,0 +1,57 @@
+// # Post-textual elements. Elementos pós-textuais.
+// NBR 6022:2018 5.3
+
+#import "../data/glossary.typ": glossaries_entries
+#import "../components.typ": *
+#import "../packages.typ": (
+ quati-abnt.article.components.include_acknowledgements, quati-abnt.common.components.include_annex,
+ quati-abnt.common.components.include_appendix, quati-abnt.common.components.include_glossary,
+)
+
+
+// ====================
+// ## Glossary. Glossário.
+// NBR 6022:2018 5.3.2
+
+#include_glossary(
+ disable_back_references: true,
+ glossaries_entries,
+)
+
+// ====================
+
+// ====================
+// ## Appendixes. Apêndices.
+
+#counter(heading).update(0)
+#include_appendix(
+ title: [Quod idem licet transferre in voluptatem, ut],
+ label: ,
+)[
+ #lorem(50)
+]
+
+// ====================
+
+// ====================
+// ## Annexes. Anexos.
+
+#counter(heading).update(0)
+#include_annex(
+ title: [Quod idem licet transferre in voluptatem, ut],
+ label: ,
+)[
+ #lorem(50)
+]
+
+// ====================
+
+// ====================
+// ## Acknowledgments. Agradecimentos.
+// NBR 6022:2018 5.3.5
+
+#include_acknowledgements[
+ #lorem(10)
+]
+
+// ====================
diff --git a/packages/preview/quati-abnt/0.1.0/template/article/content/pre_textual.typ b/packages/preview/quati-abnt/0.1.0/template/article/content/pre_textual.typ
new file mode 100644
index 0000000000..e2e50d8869
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/article/content/pre_textual.typ
@@ -0,0 +1,84 @@
+// # Pre-textual elements. Elementos pré-textuais.
+// NBR 6022:2018 5.1
+
+#import "../data/data.typ": authors, subtitle, title
+#import "../components.typ": *
+#import "../packages.typ": (
+ glossarium, quati-abnt.article.components.include_abstracts, quati-abnt.article.components.include_opening,
+ quati-abnt.common.components.print_title,
+)
+
+
+// ## Title in foreign language. Título em língua estrangeira.
+#let title_in_foreign_language = {
+ print_title(
+ title: {
+ foreign_text[Writing guide]
+ },
+ subtitle: {
+ foreign_text[scientific paper]
+ },
+ )
+}
+
+
+// ## Abstract. Resumo.
+
+// ### Abstract in main language. Resumo em língua principal.
+#let abstract_in_main_language = {
+ (
+ keywords_title: "Palavras-chave",
+ keywords: (
+ "modelo",
+ "artigo",
+ "ABNT",
+ "Typst",
+ ),
+ title: "Resumo",
+ body: [
+ Este exemplo apresenta o uso do `quati-abnt`, modelo de artigo para o Typst segundo as @nbr:pl da @abnt.
+ ],
+ )
+}
+
+// ### Abstract in foreign language. Resumo em língua estrangeira.
+#let first_abstract_in_foreign_language = {
+ (
+ keywords_title: "Keywords",
+ keywords: (
+ "template",
+ "paper",
+ "ABNT",
+ "Typst",
+ ),
+ title: "Abstract",
+ body: [
+ #text(
+ lang: "en",
+ region: "us",
+ )[
+ This exemple presents the use of the `quati-abnt`, a paper template for Typst according to the #glossarium.gls("nbr", plural: true, display: "Brazilian Norms (NBRs)") from the #glossarium.gls("abnt", display: "Brazilian Association of Technical Norms (ABNT)").
+ ]
+ ],
+ )
+}
+
+// ## Lista de resumos.
+// Include in this list all abstracts in the order they should appear.
+// Inclua nessa lista todos os resumos da ordem em que eles devem aparecer.
+#let abstracts = (
+ abstract_in_main_language,
+ first_abstract_in_foreign_language,
+)
+
+
+// ## Display. Exibição.
+
+#include_opening(
+ authors: authors,
+ subtitle: subtitle,
+ title_in_foreign_language: title_in_foreign_language,
+ title: title,
+)
+
+#include_abstracts(abstracts: abstracts)
diff --git a/packages/preview/quati-abnt/0.1.0/template/article/content/textual/main.typ b/packages/preview/quati-abnt/0.1.0/template/article/content/textual/main.typ
new file mode 100644
index 0000000000..efb048d0b9
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/article/content/textual/main.typ
@@ -0,0 +1,101 @@
+#import "../../components.typ": *
+#import "../../packages.typ": *
+
+
+= Introdução
+
+Esta é a @seção:introdução, de introdução.
+
+== Citação
+
+#quote(
+ attribution: [
+ @dumont:1918:o_que_eu_vi_o_que_nos_veremos[p. 15].
+ ],
+ block: true,
+)[
+ --- Quero um balão de cem metros cúbicos.
+
+ Grande espanto!
+ Creio mesmo que pensaram que eu era doido.
+ Alguns meses depois, o "Brasil", com grande espanto de todos os entendidos, atravessava Paris, lindo na sua transparência, como uma grande bola de sabão
+]
+
+== Ilustração
+
+#describe_figure(
+ sticky: true,
+ [
+ #figure(
+ caption: [
+ Quadrado preto
+ ],
+ image(
+ width: 4.75cm,
+ "./../../assets/images/black_square.png",
+ ),
+ )
+ ],
+)
+
+Esta é a @figura:quadrado_preto.
+
+== Nota de rodapé
+
+Exemplo de nota de rodapé
+#footnote[
+ #lorem(10)
+].
+
+== Nota de editor
+
+#note_from_alice()[
+ Nota da Alice.
+]
+
+#note_from_gabriel(note: todo_note)[
+ Nota de afazeres do Gabriel.
+]
+
+== Texto mono-espaçado
+
+```
+Lorem ipsum dolor sit amet, consectetur adipiscing elit,
+sed do eiusmod tempor incididunt ut labore et dolore magnam
+aliquam quaerat voluptatem.
+```
+
+== Equações
+
+#describe_figure(
+ // placement: auto,
+)[
+ #figure(
+ supplement: "Esquema",
+ kind: "scheme",
+ caption: [
+ Soma entre dois números.
+ ],
+ )[
+ #equation(
+ width: 41.82%,
+ )[
+ $ 1 + 1 = 2 $
+ ]
+ ]
+]
+
+== Glossário
+
+Exemplo de uso de texto no glossário:
+@rn.
+
+Exemplo de uso de termo útil: #get_term("software").
+
+= Fundamentação teórica
+
+= Material e métodos
+
+= Resultados
+
+= Considerações finais
diff --git a/packages/preview/quati-abnt/0.1.0/template/article/data/bibliography.bib b/packages/preview/quati-abnt/0.1.0/template/article/data/bibliography.bib
new file mode 100644
index 0000000000..b68b0a17aa
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/article/data/bibliography.bib
@@ -0,0 +1,24 @@
+@book{dumont:1918:o_que_eu_vi_o_que_nos_veremos,
+ address = {São Paulo},
+ author = {Dumont, Alberto Santos},
+ edition = {1},
+ publisher = {Wikisource},
+ title = {O que eu vi, o que nós veremos},
+ url = {https://pt.wikisource.org/wiki/O_que_eu_vi,_o_que_n%C3%B3s_veremos},
+ urldate = {2025-08-02},
+ year = {1918},
+}
+
+@article{li:2022:survey_convolutional_neural_networks,
+ author = {Li, Zewen and Liu, Fan and Yang, Wenjie and Peng, Shouheng and Zhou, Jun},
+ doi = {10.1109/TNNLS.2021.3084827},
+ journal = {IEEE Transactions on Neural Networks and Learning Systems},
+ keywords = {Convolutional neural networks;Feature extraction;Neurons;Deep learning;Computer vision;Computer vision;convolutional neural networks (CNNs);deep learning;deep neural networks},
+ number = {12},
+ pages = {6999-7019},
+ title = {A Survey of Convolutional Neural Networks: Analysis, Applications, and Prospects},
+ url = {https://doi.org/10.1109/TNNLS.2021.3084827},
+ urldate = {2025-01-31},
+ volume = {33},
+ year = {2022},
+}
diff --git a/packages/preview/quati-abnt/0.1.0/template/article/data/data.typ b/packages/preview/quati-abnt/0.1.0/template/article/data/data.typ
new file mode 100644
index 0000000000..dac0110db4
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/article/data/data.typ
@@ -0,0 +1,41 @@
+// # Article metadata. Metadados para artigo.
+// This file contains metadata for an article.
+// For the optional fields, you can leave them empty or comment the square brackets.
+
+// Title — required.
+// Título — obrigatório.
+#let title = {
+ [Guia de redação]
+}
+
+// Subtitle — optional.
+// Subtítulo — opcional.
+#let subtitle = {
+ [artigo científico]
+}
+
+
+// Authors — required.
+// Autores — obrigatório.
+#let authors = (
+ (
+ first_name: [Gabriel],
+ middle_name: none,
+ last_name: [Malosto],
+ gender: "m",
+ curriculum: [
+ Universidade Federal de Juiz de Fora, Mestrando em Ciência da Computação, PPGCC.
+ E-mail: #link("mailto:professional@gabdumal.com").
+ ],
+ ),
+ (
+ first_name: [Alice],
+ middle_name: [de Exemplo],
+ last_name: [Almeida],
+ gender: "f",
+ curriculum: [
+ Universidade de Exemplo, Mestre em Preenchimento de Espaços.
+ E-mail: #link("mailto:alice@email.com").
+ ],
+ ),
+)
diff --git a/packages/preview/quati-abnt/0.1.0/template/article/data/glossary.typ b/packages/preview/quati-abnt/0.1.0/template/article/data/glossary.typ
new file mode 100644
index 0000000000..1f4408707b
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/article/data/glossary.typ
@@ -0,0 +1,40 @@
+// # Glossary. Glossário.
+
+#import "../components.typ": *
+
+#let abbreviations_entries = (
+ (
+ key: "abnt",
+ short: "ABNT",
+ long: "Associação Brasileira de Normas Técnicas",
+ group: "Normatização",
+ ),
+ (
+ key: "nbr",
+ short: "NBR",
+ plural: "NBRs",
+ long: "Norma Brasileira",
+ longplural: "Normas Brasileiras",
+ group: "Normatização",
+ ),
+)
+
+#let glossary_entries = (
+ (
+ key: "rn",
+ short: "rede neural",
+ plural: "redes neurais",
+ custom: foreign_text[neural network],
+ description: [Em inglês, #foreign_text[neural network]. Modelo computacional composto por camadas de unidades interligadas que aprendem padrões em dados por meio de ajustes de pesos @li:2022:survey_convolutional_neural_networks.],
+ group: "Computação",
+ ),
+)
+
+#let symbols_entries = ()
+
+
+#let glossaries_entries = (
+ ..abbreviations_entries,
+ ..glossary_entries,
+ ..symbols_entries,
+)
diff --git a/packages/preview/quati-abnt/0.1.0/template/article/data/terms.typ b/packages/preview/quati-abnt/0.1.0/template/article/data/terms.typ
new file mode 100644
index 0000000000..230391b7c4
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/article/data/terms.typ
@@ -0,0 +1,45 @@
+// # Terms. Termos.
+
+#import "../packages.typ": quati-abnt.common.components.foreign_text, quati-abnt.common.components.get_term_in_list
+
+
+// ## Definition. Definição.
+#let terms_entries = (
+ (
+ key: "link",
+ short: foreign_text[link],
+ short_capitalized: foreign_text[Link],
+ plural: foreign_text[links],
+ plural_capitalized: foreign_text[Links],
+ ),
+ (
+ key: "script",
+ short: foreign_text[script],
+ plural: foreign_text[scripts],
+ ),
+ (
+ key: "software",
+ short: foreign_text[software],
+ ),
+ (
+ key: "web",
+ short: foreign_text[web],
+ ),
+)
+
+
+// ## Access. Acesso.
+#let get_term = (
+ capitalize: false,
+ field: "short",
+ plural: false,
+ term_key,
+) => {
+ get_term_in_list(
+ capitalize: capitalize,
+ field: field,
+ plural: plural,
+ terms_entries: terms_entries,
+ term_key,
+ )
+}
diff --git a/packages/preview/quati-abnt/0.1.0/template/article/main.typ b/packages/preview/quati-abnt/0.1.0/template/article/main.typ
new file mode 100644
index 0000000000..9f5135d965
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/article/main.typ
@@ -0,0 +1,50 @@
+// # Article. Artigo.
+// NBR 6022:2018
+
+#import "./data/glossary.typ": glossaries_entries
+#import "./components.typ": *
+#import "./packages.typ": *
+
+
+// ## Glossary. Glossário.
+#show: glossarium.make-glossary
+#glossarium.register-glossary(glossaries_entries)
+
+
+// ## Template. Modelo.
+#show: it => quati-abnt.article.template(
+ it,
+
+ // Define the color of links and cross-references.
+ // Defina a cor dos links e das referências cruzadas.
+ color_of_links: quati-abnt.common.style.color_of_links,
+
+ // Define the font family to be used on each context.
+ // Defina a família tipográfica a ser utilizada em cada contexto.
+ font_family_for_common_text: quati-abnt.common.style.font_family_serif,
+ font_family_for_highlighted_text: quati-abnt.common.style.font_family_sans,
+ font_family_for_math_text: quati-abnt.common.style.font_family_math,
+ font_family_for_monospaced_text: quati-abnt.common.style.font_family_mono,
+ font_family_for_editor_notes: quati-abnt.common.style.font_family_sans,
+
+ // Define whether to use larger text as typographic highlight instead of uppercase.
+ // Defina se deve ser utilizada uma fonte maior como destaque tipográfico em vez de caixa-alta.
+ should_use_larger_text_to_highlight: false,
+
+ // Define whether to count pages and place its numbers at the headers.
+ // Defina se deve contar as páginas e exibir seus números nos cabeçalhos.
+ should_number_pages: true,
+
+ // Define whether to display editor notes.
+ // Defina se deve exibir as notas de editor.
+ should_display_editor_notes: true,
+)
+
+
+#include "./content/pre_textual.typ"
+
+#include "./content/textual/main.typ"
+
+#bibliography("./data/bibliography.bib")
+
+#include "./content/post_textual.typ"
diff --git a/packages/preview/quati-abnt/0.1.0/template/article/packages.typ b/packages/preview/quati-abnt/0.1.0/template/article/packages.typ
new file mode 100644
index 0000000000..be488cfafc
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/template/article/packages.typ
@@ -0,0 +1,4 @@
+// # Packages. Pacotes.
+
+#import "@preview/quati-abnt:0.1.0" as quati-abnt
+#let glossarium = quati-abnt.common.packages.glossarium
diff --git a/packages/preview/quati-abnt/0.1.0/thumbnail.png b/packages/preview/quati-abnt/0.1.0/thumbnail.png
new file mode 100644
index 0000000000..af474da497
Binary files /dev/null and b/packages/preview/quati-abnt/0.1.0/thumbnail.png differ
diff --git a/packages/preview/quati-abnt/0.1.0/typst.toml b/packages/preview/quati-abnt/0.1.0/typst.toml
new file mode 100644
index 0000000000..438175f9fc
--- /dev/null
+++ b/packages/preview/quati-abnt/0.1.0/typst.toml
@@ -0,0 +1,50 @@
+[package]
+name = "quati-abnt"
+version = "0.1.0"
+entrypoint = "src/lib.typ"
+authors = ["Gabriel Malosto "]
+license = "AGPL-3.0-or-later"
+description = "Documents according to the Associação Brasileira de Normas Técnicas (ABNT)."
+repository = "https://github.com/gabdumal/quati_abnt"
+keywords = [
+ "Associação Brasileira de Normas Técnicas",
+ "ABNT",
+ "Article",
+ "Paper",
+ "Monograph",
+ "Thesis",
+]
+categories = ["paper", "thesis"]
+exclude = [
+ "/.devcontainer",
+ "/.git",
+ "/.vscode",
+ "/examples",
+ "/scripts",
+ "/target",
+ "/.gitignore",
+ "/.gitmodules",
+ "/compose.yml",
+ "/TODO.md",
+ "/tinymist.lock",
+]
+
+[template]
+path = "template"
+entrypoint = "article/main.typ"
+thumbnail = "thumbnail.png"
+
+[tool.utpm]
+exclude = [
+ ".devcontainer",
+ ".git",
+ ".vscode",
+ "examples",
+ "scripts",
+ "target",
+ ".gitignore",
+ ".gitmodules",
+ "compose.yml",
+ "TODO.md",
+ "tinymist.lock",
+]