texlive[46949] Master/texmf-dist: factura (13mar18)

commits+karl at tug.org commits+karl at tug.org
Tue Mar 13 22:59:20 CET 2018


Revision: 46949
          http://tug.org/svn/texlive?view=revision&revision=46949
Author:   karl
Date:     2018-03-13 22:59:20 +0100 (Tue, 13 Mar 2018)
Log Message:
-----------
factura (13mar18)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/factura/README
    trunk/Master/texmf-dist/doc/latex/factura/factura-beispiel-rechnung.tex
    trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-aux.tex
    trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura06.tex
    trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura09.tex
    trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura10.tex
    trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-prefactura.pdf
    trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex
    trunk/Master/texmf-dist/doc/latex/factura/factura.pdf
    trunk/Master/texmf-dist/source/latex/factura/factura.dtx
    trunk/Master/texmf-dist/tex/latex/factura/factura.cls
    trunk/Master/texmf-dist/tex/latex/factura/factura.def

Modified: trunk/Master/texmf-dist/doc/latex/factura/README
===================================================================
--- trunk/Master/texmf-dist/doc/latex/factura/README	2018-03-13 21:51:13 UTC (rev 46948)
+++ trunk/Master/texmf-dist/doc/latex/factura/README	2018-03-13 21:59:20 UTC (rev 46949)
@@ -1,4 +1,4 @@
-<factura>
+<factura>
 
 * Brief description in english *
 

Modified: trunk/Master/texmf-dist/doc/latex/factura/factura-beispiel-rechnung.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/factura/factura-beispiel-rechnung.tex	2018-03-13 21:51:13 UTC (rev 46948)
+++ trunk/Master/texmf-dist/doc/latex/factura/factura-beispiel-rechnung.tex	2018-03-13 21:59:20 UTC (rev 46949)
@@ -87,7 +87,7 @@
 \def\@@DenomFactura{Rechnung}
 \def\@@DenomCotiza{Voranschlag}
 % \LetraNumeracion{\fontsize{14}{14}\bfseries}
-\renewcommand{\@EstiloDenom}{\@LetraDenom\@Denominacion-\if at sinnumero\else\@LetraNumeracion Nr:\space\@Num\fi}
+\renewcommand{\@EstiloDenom}{\@LetraDenom\@Denominacion-\ifsinnumero\else\@LetraNumeracion Nr:\space\@Num\fi}
 \renewcommand{\@EstiloNumControl}{}
 \makeatother
 

Modified: trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-aux.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-aux.tex	2018-03-13 21:51:13 UTC (rev 46948)
+++ trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-aux.tex	2018-03-13 21:59:20 UTC (rev 46949)
@@ -63,6 +63,7 @@
  \begin{itemize}
   \DescEjemplo
  \end{itemize}
+ \catcode`\%=14
  \catcode`\<=13
  \catcode`\>=13
  }

Modified: trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura06.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura06.tex	2018-03-13 21:51:13 UTC (rev 46948)
+++ trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura06.tex	2018-03-13 21:59:20 UTC (rev 46949)
@@ -91,6 +91,8 @@
 
 \Descripcion{
 
+ Se facturaron en total \arabic{NumItem} artículos.
+
  En el artículo número \itemref{primeritem} se facturaron \cantref{primeritem} \descref{primeritem} por un valor de \Moneda\puref{primeritem} cada uno, dando un subtotal por este elemento de \Moneda\subtref{primeritem}; el descuento en ese artículo es del \dctoref{primeritem}\%, dando un total de \Moneda\ptref{primeritem}, y esta gravado con IVA de \ivaref{primeritem}\%.
 
  La base imponible total de esta factura es de \Moneda\numprint\BIG; el IVA es de \Moneda\numprint\AlicuotaG, el descuento presidencial en el IVA es de \Moneda\numprint\AlicuotaGDesc, y el total final es de \Moneda\numprint\Total.

Modified: trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura09.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura09.tex	2018-03-13 21:51:13 UTC (rev 46948)
+++ trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura09.tex	2018-03-13 21:59:20 UTC (rev 46949)
@@ -76,7 +76,7 @@
 \SepCondiciones{16pt}
 \LineaCondiciones{0.4pt}{4pt}{3pt}
 
-\Condiciones{La factura se emitió el \DTMusedate{FechaEmision} con crédito de \Credito{} dias, siendo su fecha de vencimiento el \DTMusedate{FechaVencimiento}.}
+\Condiciones{La factura se emitió el \Fecha{} con crédito de \Credito{} dias, siendo su fecha de vencimiento el \FechaVencimiento.}
 \NotaPrevia{\hfill LA NOTA PREVIA}
 \NotaExterna{LA NOTA EXTERNA}
 

Modified: trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura10.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura10.tex	2018-03-13 21:51:13 UTC (rev 46948)
+++ trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura10.tex	2018-03-13 21:59:20 UTC (rev 46949)
@@ -39,6 +39,7 @@
 %%<desc>
 %%  Escribimos una factura
 %%  Escribimos en el reverso de la factura
+%%  Establecemos las opciones de la clase a través de comandos
 %%  (sinlineasv) Sin lineas verticales
 %%  (sinlineash) Sin lineas horizontales
 %%  (electro) Con descuento en IVA al pagar por medios electrónicos
@@ -52,12 +53,14 @@
 %%</desc>
 %%
 \documentclass[
+filas, % luego queda sin efecto con \filasfalse en el preámbulo
 sinlineasv,
 sinlineash,
-electro,
-vencimiento,
+csv, % luego queda sin efecto con \csvfalse en el preámbulo
 ]{factura}
 
+\electrotrue \vencimientotrue \filasfalse \csvfalse
+
 \input{factura-ejemplo-aux.tex}% Se incluye para efectos del ejemplo, así tendremos disponible la macro \Ejemplo.
 \usepackage[utf8]{inputenc}
 

Modified: trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-prefactura.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex	2018-03-13 21:51:13 UTC (rev 46948)
+++ trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex	2018-03-13 21:59:20 UTC (rev 46949)
@@ -90,6 +90,8 @@
 \begin{reporte}
  El reporte - página 1\newpage El reporte - página 2 \newpage El reporte - página 3.
 
+ Se facturaron en total \arabic{NumItem} artículos.
+
  En el artículo número \itemref{primeritem} se facturaron \cantref{primeritem} \descref{primeritem} por un valor de \Moneda\puref{primeritem} cada uno, dando un subtotal por este elemento de \Moneda\subtref{primeritem}; el descuento en ese artículo es del \dctoref{primeritem}\%, dando un total de \Moneda\ptref{primeritem}, y esta gravado con IVA de \ivaref{primeritem}\%.
 
  La base imponible total de esta factura es de \Moneda\numprint\BIG; el IVA es de \Moneda\numprint\AlicuotaG, el descuento presidencial en el IVA es de \Moneda\numprint\AlicuotaGDesc, y el total final es de \Moneda\numprint\Total.

Modified: trunk/Master/texmf-dist/doc/latex/factura/factura.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/factura/factura.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/factura/factura.dtx	2018-03-13 21:51:13 UTC (rev 46948)
+++ trunk/Master/texmf-dist/source/latex/factura/factura.dtx	2018-03-13 21:59:20 UTC (rev 46949)
@@ -173,7 +173,7 @@
 %<class>\ProvidesClass{factura}
 %<def>\ProvidesFile{factura.def}
 %<*class|def>
-[2017/12/11 v3.40
+[2018/03/13 v3.44
 %<class>Clase para elaborar facturas legales
 %<class>en la República Bolivariana de Venezuela.
 %<def>Archivo de valores iniciales y condiciones de borde para factura.cls
@@ -398,12 +398,18 @@
  
  % v3.02 -> Esta versión v3.02 se saca porque la versión 3.9 de |fancyhdr| hizo necesaria esta actualización por un error que daba con los reportes por el uso en esta clase de la macro |\fancy at setoffs|. Lo que hacíamos con esa macro de |fancyhdr| lo hicimos ahora de otra forma mejor, dada la incompatibilidad con la nueva versión de ese paquete.%v3.02
  
- Esta versión se saca por los cambios en la política impositiva decretados por el Presidente en Decreto número 3085 relativos a descuentos del 3\% y 5\% en el IVA general cuando los pagos se hacen por medios electrónicos; también se corrigió la tasa de IVA adicional.
+ La versión 3.40 se saca por los cambios en la política impositiva decretados por el Presidente en Decreto número 3085 relativos a descuentos del 3\% y 5\% en el IVA general cuando los pagos se hacen por medios electrónicos; también se corrigió la tasa de IVA adicional.%v3.40
  
- Adicionalmente se agregaron nuevas opciones en cuanto al manejo de la fecha de emisión y su formato, posibilidad de facturas a crédito con fecha de vencimiento, campos nuevos adicionales para agregar más textos en la factura, posibilidad de imprimir información en el reverso de la hoja de la factura, posibilidades nuevas en cuanto al posicionamiento de los elementos fijos, diseño \tikz más versátil en los cuadros con bordes, mejor manejo del archivo |.csv|, cambios en los nombres de algunos comandos y opciones.
+ En la versión 3.40 se agregaron nuevas opciones en cuanto al manejo de la fecha de emisión y su formato, posibilidad de facturas a crédito con fecha de vencimiento, campos nuevos adicionales para agregar más textos en la factura, posibilidad de imprimir información en el reverso de la hoja de la factura, posibilidades nuevas en cuanto al posicionamiento de los elementos fijos, diseño \tikz más versátil en los cuadros con bordes, mejor manejo del archivo |.csv|, cambios en los nombres de algunos comandos y opciones.%v3.40
  
- Finalmente se cambió la estructura de la sección de los comandos en esta documentación y se agregó una página de descripción al final de cada ejemplo.
+ En la misma versión 3.40 se cambió la estructura de la sección de los comandos en esta documentación y se agregó una página de descripción al final de cada ejemplo.%v3.40
  
+ El cambio en la política impositiva reflejado en la versión 3.40 queda sin efecto para fines legales, ya no está vigente dicho descuento; sin embargo, no eliminamos el código que lo produce sino que la clase arroja una advertencia cuando se pide usar la opción de descuentos por pago electrónico.%v3.44
+ 
+ La versión actual 3.44 nos permite activar cualquier opción de la clase a través de condicionales en el preámbulo y no solamente como una opción al cargar la clase; también se puede ahora quitar el efecto de cualquier opción previamente dada al cargar la clase, esto con el propósito de hacer más versátil el uso de las opciones y así poder incluirlas también en archivos |.tex| o |.def| personalizados.%v3.44
+ 
+ Adicionalmente la versión 3.44 escribe en el archivo |.log| todas las opciones que fueron pedidas al cargar la clase.%v3.44
+ 
  \section*{Agradecimientos}
  
  Por pruebas y sugerencias que dieron lugar a mejoras agradezco a Ritguey%
@@ -558,6 +564,10 @@
 % \changes{v3.40}{2017/12/11}{Quitada la macro \cs{mostrar}. Ahora cada texto a mostrar se hace con el mismo comando con el que se definió.}
 % \changes{v3.40}{2017/12/11}{Algunos condicionales cambiados.}
 % \changes{v3.40}{2017/12/11}{Otra vez corregida la macro interna \cs{@DescripcionAuxCmd} y arreglado el espaciado entre los ítems; ojalá que esta vez sí esté bien.}
+% \changes{v3.44}{2018/03/13}{Reestructurado el archivo \texttt{.cls} para aceptar prender y apagar las opciones de la clase a través de condicionales de \TeX{} con el mismo nombre de la opción.}
+% \changes{v3.44}{2018/03/13}{Se cambió un \cs{AtBeginDocument} que escribía texto en la hoja por un \cs{AfterEndPreamble}.}
+% \changes{v3.44}{2018/03/13}{Se acabó el descuento del IVA. Ahora advierte cuando se usa, posibilitando su uso después si llegan a volver a activar la medida.}
+% \changes{v3.44}{2018/03/13}{Cada opción cargada escribe un comentario en el archivo \texttt{.log} para depuración.}
 %
 %
 % \tableofcontents
@@ -728,7 +738,7 @@
 %
 % \section{Opciones al cargar la clase\label{sec:opciones}}
 %
-% Al cargar la clase con |\documentclass| se le puede dar opciones de la siguiente lista, para cambiar su comportamiento:
+%  Al cargar la clase con |\documentclass| podemos dar distintas opciones según el comportamiento que queramos; dichas opciones están descritas en esta sección y cualquier opción cargada se verá como comentario en el archivo |.log| de la compilación bajo el texto “{\ttfamily Opción cargada: }” con el nombre de la opción pedida.
 %
 %
 % \subsection{Sobre el tipo de documento a producir}
@@ -876,6 +886,12 @@
 % \DescribeOption{csv}
 %  Escribe un archivo csv con la información numérica de la factura.
 %
+% \subsection{Activación y desactivación de opciones desde comandos}
+%
+% Cualquiera de estas opciones también se puede activar o desactivar en el preámbulo y así poder incluirlas dentro de archivos que vayan a ser cargados con |\input| o |\include| como se explicará en la subsección \ref{subsec:aux}. Esto significa que podremos desactivar una opción que hayamos dado en |\documentclass| o activar alguna que no hayamos activado allí.
+%
+% Para hacer eso debemos usar el condicional que cada opción maneja y activarlo o desactivarlo de la forma como se hace en \TeX{}. El condicional de cada opción tiene el mismo nombre de la opción. Por ejemplo, para quitar las lineas verticales (|sinlineasv|) usaríamos |\sinlineasvtrue| en el preámbulo, o para desactivar la creación del archivo |.csv|, previamente activada en |\documentclass|, usaríamos |\csvfalse|.
+%
 % }
 %
 %
@@ -1578,7 +1594,7 @@
 %
 % \section{Referencias a los valores establecidos y a los totales\label{sec:ref}}
 %
-%  En el preámbulo el usuario definió distintas macros, es decir, estableció la razón social del cliente, su R.I.F., la dirección, entre otras cosas. Cualquiera de esas definiciones hechas en el preámbulo puede consultarse luego en otra parte del documento usando el comando que se usó para su definición, es decir, tenemos las siguientes macros: \cs{RazonSocial}, \cs{RIF}, \cs{Direccion}, \cs{Telefono}, \cs{Email}, \cs{Contacto}, \cs{Emisor}, \cs{Conforme}, \cs{Proveedor}, \cs{Credito}, \cs{Num}, \cs{NumSerieControl}, \cs{NumControl}, \cs{Condiciones}, \cs{Resumen}, \cs{NotaPrevia}, \cs{NotaInterna}, \cs{NotaExterna}; ellas en el preámbulo funcionarán para definir valores y textos, por ejemplo, como ya sabemos, establecemos la razón social así: \cs{RazonSocial{...}}, pero si ya no estamos en el preámbulos sino dentro del cuerpo del documento y llamamos a la macro \cs{RazonSocial}\footnote{Dentro del cuerpo del documento estas macros no aceptan parámetros.}, ella nos va a escribir el texto que definimos en el preámbulo como la razón social. Eso es usable con todas las macros que acabamos de mencionar, incluyendo las que definen textos largos como las notas o las condiciones.
+%  En el preámbulo el usuario definió distintas macros, es decir, estableció la razón social del cliente, su R.I.F., la dirección, entre otras cosas. Cualquiera de esas definiciones hechas en el preámbulo puede consultarse luego en otra parte del documento usando el comando que se usó para su definición, es decir, tenemos las siguientes macros: \cs{RazonSocial}, \cs{RIF}, \cs{Direccion}, \cs{Telefono}, \cs{Email}, \cs{Contacto}, \cs{Emisor}, \cs{Conforme}, \cs{Proveedor}, \cs{Fecha}, \cs{FechaVencimiento}\footnote{La fecha de vencimiento no se establece en el preámbulo explícitamente sino a través de \cs{Credito} pero la clase dispone de esta interfaz para acceder a ella así como también con la interfaz dada por \texttt{datetime2}.}, \cs{Credito}, \cs{Num}, \cs{NumControl}, \cs{NumSerieControl}, \cs{Condiciones}, \cs{Resumen}, \cs{NotaPrevia}, \cs{NotaInterna}, \cs{NotaExterna}, \cs{TituloReporte}; ellas en el preámbulo funcionarán para definir valores y textos, por ejemplo, como ya sabemos, establecemos la razón social así: \cs{RazonSocial{...}}, pero si ya no estamos en el preámbulos sino dentro del cuerpo del documento y llamamos a la macro \cs{RazonSocial}\footnote{Dentro del cuerpo del documento estas macros no aceptan parámetros.}, ella nos va a escribir el texto que definimos en el preámbulo como la razón social. Eso es usable con todas las macros que acabamos de mencionar, incluyendo las que definen textos largos como las notas o las condiciones.
 %
 % Por otra parte, también el usuario puede referirse al signo monetario con el comando |\Moneda|, y a cualquiera de los totales de la siguiente tabla\footnote{Las macros de la tabla, para representarlas en el mismo formato que en la factura, debemos usar la macro \cs{numprint}.}:
 %
@@ -1594,8 +1610,10 @@
 % \hline
 % \end{tabular}
 %
-% También ya mencionamos que la fecha de emisión y vencimiento se pueden acceder con la interfaz dada por el paquete |datetime2|, por ejemplo, para mostrar la fecha de emisión, usaríamos \cs{DTMusedate\{FechaEmision\}} y para la fecha de vencimiento, \cs{DTMusedate\{FechaVencimiento\}}. También aclaramos ya que la cantidad de ítems en la factura lo podemos acceder via el contador |NumItem|, por ejemplo así \cs{arabic\{NumItem\}}.
+% También ya mencionamos que la fecha de emisión y vencimiento se pueden acceder con la interfaz dada por el paquete |datetime2|, por ejemplo, para mostrar la fecha de emisión, podremos usar tanto \cs{Fecha} como \cs{DTMusedate\{FechaEmision\}}, y para la fecha de vencimiento, tanto \cs{FechaVencimiento} como \cs{DTMusedate\{FechaVencimiento\}}.
 %
+% La cantidad de ítems en la factura la podemos acceder via el contador |NumItem|, por ejemplo así \cs{arabic\{NumItem\}}.
+%
 % En los ejemplos hay casos con todas estas funciones de esta sección.
 %
 %
@@ -1917,37 +1935,55 @@
 \newbool{FirmasYnegativo}% no hay FirmasXnegativo; hay X_inicial y X_final para las firmas.
 
 %% Condicionales relativos a opciones de la clase.
-\newif\if at prefactura
-\newif\if at cotizacion
-\newif\if at nospanish
-\newif\if at sinivaexpresado
-\newif\if at todosiva
-\newif\if at sinfirmas
-\newif\if at unafirma
-\newif\if at filas
-\newif\if at agrupado
-\newif\if at centrado
-\newif\if at descuentos
-\newif\if at denom
-\newif\if at vencimiento
-\newif\if at sinnumero
-\newif\if at sintotales
-\newif\if at conlineasha
-\newif\if at linea
-\newif\if at G
-\newif\if at csv
+\newif\ifagrupado
+\newif\ifcentradesc
+\newif\ifcentrado
+\newif\ifconlineasha
+\newif\ifconreporte
+\newif\ifcotizacion
+\newif\ifcsv
+\newif\ifdcu
+\newif\ifdenom
+\newif\ifdescuentos
+\newif\ifdosfirmas
+\newif\ifduc
+\newif\ifelectro
+\newif\ifexpandecuadro
+\newif\iffilas
+\newif\ifG
+\newif\ifimpdesc
+\newif\ifiva
+\newif\iflinea
+\newif\ifnospanish
+\newif\ifnumitem
+\newif\ifprefactura
+\newif\ifsincantidad
+\newif\ifsinexpandir
+\newif\ifsinfirmas
+\newif\ifsiniva
+\newif\ifsinivaexpresado
+\newif\ifsinlineash
+\newif\ifsinlineashe
+\newif\ifsinlineashi
+\newif\ifsinlineasv
+\newif\ifsinlineasve
+\newif\ifsinlineasvi
+\newif\ifsinmarcas
+\newif\ifsinnumero
+\newif\ifsinreverso
+\newif\ifsintotales
+\newif\ifsoloreporte
+\newif\ifsubtotal
+\newif\iftodosiva
+\newif\iftwoside
+\newif\ifunafirma
+\newif\ifvencimiento
+
+%% Condicionales auxiliares.
 \newif\if at cdu \@cdutrue
-\newif\if at dcu
-\newif\if at duc
-\newif\if at expandecuadro
 \newif\if at factura \@facturatrue
 \newif\if at reverso \@reversotrue
 \newif\if at reporte
-\newif\if at impdesc
-\newif\if at centradesc
-\newif\if at sinmarcas
-
-%% Condicionales auxiliares.
 \newif\if at FondoFactura
 \newif\if at FondoReporte
 \newif\if at FondoReporteStar
@@ -1969,7 +2005,6 @@
 \newif\if at DescEnum
 \newif\if at DescuentoTotal
 
-
 %% Longitudes para uso interno.
 \newlength{\@TamDatos}
 \newlength{\@TamResumen}
@@ -2053,136 +2088,68 @@
 
 %% Contadores.
 \newcounter{@IVANoGeneral}%  '0' con sólo IVA G, '1' cuando hay IVA R o IVA A, y '2' cuando hay ambos.
+\newcounter{@Firmas}%  '0' para sinfirmas, '1' para unafirma, y '2' para dosfirmas.
+\setcounter{@Firmas}{2}
 \newcounter{NumItem}%  Número del ítem actual, para uso de algunas macros en el cuadro de la factura y para cuando se usa la opción 'numitem'.
 \newcount\AuxFecha
 
-% Errores, advertencias e informaciones de LaTeX.
+%% Errores, advertencias e informaciones de LaTeX.
 \newcommand{\CLASSERROR}[1]{\ClassError{factura}{** #1. **}{}}
 \newcommand{\CLASSWARNING}[1]{\ClassWarning{factura}{** #1. **}{}}
 \newcommand{\CLASSINFO}[1]{\ClassInfo{factura}{** #1. **}{}}
 
-% Opciones de la clase.
-\DeclareOption{prefactura}{\@prefacturatrue\@denomtrue\@sinfirmastrue}%  La prefactura; con el diseño de la forma libre... para enviar por correo electrónico, fax o imprimir preliminarmente.
-\DeclareOption{cotizacion}{\@cotizaciontrue\@denomtrue\@unafirmatrue}%  Cambia la denominación a 'COTIZACIÓN' y no 'FACTURA'.
-\DeclareOption{nospanish}{\@nospanishtrue}%  No carga babel en castellano ni la codificación T1 de las letras.
-\DeclareOption{sinfirmas}{\@sinfirmastrue}%  No agrega los espacios para firmar.
-\DeclareOption{unafirma}{\@unafirmatrue\@sinfirmasfalse}%  No agrega el espacio para que firme quien recibe.
-\DeclareOption{dosfirmas}{\@unafirmafalse\@sinfirmasfalse}%  Pone las dos firmas para firmar.
-\DeclareOption{descuentos}{\booltrue{Descuentos}\@descuentostrue}%  Para los descuentos individuales.
-\DeclareOption{iva}{\@impdesctrue\booltrue{IVA}}%  Para la columna del IVA.
-\DeclareOption{subtotal}{%  Para la columna extra del subtotal antes del descuento.
- \if at descuentos
-  \booltrue{Subtotal}
- \else
-  \CLASSWARNING{La opción 'subtotal' no aplica sin descuentos individuales. Sin efecto opción 'subtotal'}
- \fi}
-\DeclareOption{denom}{\@denomtrue}%  Agrega el texto con la denominación del documento, para las formas libres que no tienen el número de factura.
-\DeclareOption{vencimiento}{\@vencimientotrue}%  Escribe fecha de vencimiento, aún con facturas sin crédito.
-\DeclareOption{sinnumero}{\@sinnumerotrue\@denomtrue}%  Escribir el texto de la denominación del documento pero sin escribir el número.
-\DeclareOption{G}{\@Gtrue}%  Con esta opción sale la letra 'G' en los items con IVA general, y sale el porcentaje en la base imponible general.
-\DeclareOption{filas}{\@filastrue}%  Estilo de totalización en filas.
-\DeclareOption{sintotales}{\@sintotalestrue%  No escribe los totales al final, por ejemplo para cotizaciones de productos similares.
- \if at filas
-  \CLASSWARNING{La opción 'sintotales' no aplica para el modo de totalización en filas. Sin efecto opción 'filas'}
-  \@filasfalse
- \fi
- \if at cotizacion
- \else
-  \CLASSWARNING{La opción 'sintotales' no debe usarse en facturas sino en cotizaciones. No es válida una factura sin totales}
- \fi}
-\DeclareOption{centrado}{%  Total y exento 'centrado'; sólo para estilo 'filas'
- \if at filas
-  \@centradotrue
- \else
-  \CLASSWARNING{La opción 'centrado' no es compatible con el modo de totalización en columnas. Sin efecto opción 'centrado'}
- \fi}
-\DeclareOption{agrupado}{%  Agrupados los elementos totalizadores en el modo en columnas.
- \if at filas
-  \CLASSWARNING{La opción 'agrupado' no es compatible con el modo de totalización en filas. Sin efecto opción 'agrupado'}
- \else
-  \@agrupadotrue
- \fi}
-\DeclareOption{impdesc}{\@impdesctrue}%  Para el tipo de impuesto en la descripción y no en el precio unitario y total.
-\DeclareOption{centradesc}{\@centradesctrue}%  Para centrar la descripción de cada ítem.
-\DeclareOption{sinmarcas}{\@sinmarcastrue}%  Para evitar que aparezcan los caracteres especiales cuando la descripción es larga.
-\DeclareOption{numitem}{\booltrue{NumItem}}%  Para poner una columna extra al principio con el número del ítem.
-\DeclareOption{dcu}{%  Descripción, luego cantidad y luego precio unitario.
- \@dcutrue\@cdufalse\@ducfalse
- \booltrue{DCU}\boolfalse{DUC}
- \booltrue{PrimeroDescripcion}}
-\DeclareOption{duc}{%  Descripción, luego precio unitario y luego cantidad.
- \if at dcu
-  \CLASSWARNING{Las opciones 'duc' y 'dcu' no son compatibles. Sin efecto ambas opciones}
-  \boolfalse{PrimeroDescripcion}\boolfalse{DCU}\@dcufalse\@cdutrue
- \else
-  \@ductrue\@cdufalse\@dcufalse
-  \booltrue{DUC}\boolfalse{DCU}
-  \booltrue{PrimeroDescripcion}
- \fi}
-\DeclareOption{siniva}{\AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}}%  No cobra IVA.
-\DeclareOption{todosiva}{\@todosivatrue}%  Con esta opción salen todos los IVA así valgan cero.
-\DeclareOption{electro}{%  Parche por el Decreto 3085 de Nikolài.
- \booltrue{Electro}
- \gdef\@NotaInterna{\@TextoDescuentoPresidencial}
- \CLASSINFO{Se estableció el texto aclaratorio del descuento presidencial como 'nota interna'}
- \if at filas
-  \CLASSWARNING{La opción 'electro' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'}
-  \@filasfalse
- \fi}
-\DeclareOption{sinivaexpresado}{%  Cuando no se cobra IVA y tampoco se quiere que aparezca la totalización del IVA.
- \@sinivaexpresadotrue
- \if at filas
-  \CLASSWARNING{La opción 'sinivaexpresado' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'}
-  \@filasfalse
- \else
-  \AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}
- \fi}
-\DeclareOption{sincantidad}{%  Para no poner el campo de la cantidad.
- \booltrue{SinCantidad}
- \if at dcu
-  \CLASSWARNING{La opción 'sincantidad' no es compatible con 'dcu' . Sin efecto opción 'dcu'}
-  \@dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDescripcion}
- \fi
- \if at duc
-  \CLASSWARNING{La opción 'sincantidad' no es compatible con 'duc' . Sin efecto opción 'duc'}
-  \@ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDescripcion}
- \fi}
-\DeclareOption{conlineasha}{\@conlineashatrue}%  Una línea horizontal para cada ítem, como las facturas a mano.
-\DeclareOption{sinlineasv}{%  Estilo 'sinlineasv'.
- \booltrue{SinLineasVertExt}\booltrue{SinLineasVertInt}}
-\DeclareOption{sinlineasvi}{\booltrue{SinLineasVertInt}}%  Estilo 'sinlineasvi'.
-\DeclareOption{sinlineasve}{\booltrue{SinLineasVertExt}}%  Estilo 'sinlineasve'.
-\DeclareOption{sinlineash}{%  Estilo 'sinlineash'.
- \booltrue{SinLineasHoriExt}\booltrue{SinLineasHoriInt}}
-\DeclareOption{sinlineashi}{\booltrue{SinLineasHoriInt}}%  Estilo 'sinlineashi'.
-\DeclareOption{sinlineashe}{\booltrue{SinLineasHoriExt}}%  Estilo 'sinlineashe'.
-\DeclareOption{expandecuadro}{\@expandecuadrotrue\boolfalse{ExpAbajo}}%  Para rellenar con líneas en blanco de manera automática.
-\DeclareOption{sinexpandir}{\boolfalse{ExpAbajo}\@expandecuadrofalse}%  No expande ninguna de las dos partes de la factura.
-\DeclareOption{linea}{%  Para la línea que protege el espacio en blanco.
- \if at expandecuadro
-  \@lineatrue
- \else
-  \CLASSWARNING{La opción 'linea' requiere la opción 'expandecuadro'. Sin efecto opción 'linea'}
- \fi}
-\DeclareOption{conreporte}{\@reportetrue}%  Para imprimir factura y reporte.
-\DeclareOption{soloreporte}{\@reportetrue\@facturafalse\@reversofalse}%  Para imprimir sólo el reporte.
-\DeclareOption{sinreverso}{\@reversofalse}%  Para no imprimir el reverso de la factura.
-\DeclareOption{twoside}{\PassOptionsToClass{twoside}{article}}%  Opción 'twoside' de article para los reportes.
-\DeclareOption{csv}{%  Para la salida en modo csv también.
- \if at factura
-  \@csvtrue
-  \if at sintotales\else\AtEndDocument{\@EscribeTotalesEnCSV}\fi
- \else
-  \CLASSWARNING{La opción 'csv' require generar la factura. Sin efecto opción 'csv'}
- \fi}
+%% Opciones de la clase.
+\DeclareOption{agrupado}{\agrupadotrue}%  Agrupados los elementos totalizadores en el modo en columnas.
+\DeclareOption{centradesc}{\centradesctrue}%  Para centrar la descripción de cada ítem.
+\DeclareOption{centrado}{\centradotrue}%  Total y exento 'centrado'; sólo para estilo 'filas'
+\DeclareOption{conlineasha}{\conlineashatrue}%  Una línea horizontal para cada ítem, como las facturas a mano.
+\DeclareOption{conreporte}{\conreportetrue}%  Para imprimir factura y reporte.
+\DeclareOption{cotizacion}{\cotizaciontrue}%  Cambia la denominación a 'COTIZACIÓN' y no 'FACTURA'.
+\DeclareOption{csv}{\csvtrue}%  Para la salida en modo csv también.
+\DeclareOption{dcu}{\dcutrue}%  Descripción, luego cantidad y luego precio unitario.
+\DeclareOption{denom}{\denomtrue}%  Agrega el texto con la denominación del documento, para las formas libres que no tienen el número de factura.
+\DeclareOption{descuentos}{\descuentostrue}%  Para los descuentos individuales.
+\DeclareOption{dosfirmas}{\dosfirmastrue}%  Pone las dos firmas para firmar.
+\DeclareOption{duc}{\ductrue}%  Descripción, luego precio unitario y luego cantidad.
+\DeclareOption{electro}{\electrotrue}%  Parche por el Decreto 3085 de Nikolài.
+\DeclareOption{expandecuadro}{\expandecuadrotrue}%  Para rellenar con líneas en blanco de manera automática.
+\DeclareOption{filas}{\filastrue}%  Estilo de totalización en filas.
+\DeclareOption{G}{\Gtrue}%  Con esta opción sale la letra 'G' en los items con IVA general, y sale el porcentaje en la base imponible general.
+\DeclareOption{impdesc}{\impdesctrue}%  Para el tipo de impuesto en la descripción y no en el precio unitario y total.
+\DeclareOption{iva}{\ivatrue}%  Para la columna del IVA.
+\DeclareOption{linea}{\lineatrue}%  Para la línea que protege el espacio en blanco.
+\DeclareOption{nospanish}{\nospanishtrue}%  No carga babel en castellano ni la codificación T1 de las letras.
+\DeclareOption{numitem}{\numitemtrue}%  Para poner una columna extra al principio con el número del ítem.
+\DeclareOption{prefactura}{\prefacturatrue}%  La prefactura; con el diseño de la forma libre... para enviar por correo electrónico, fax o imprimir preliminarmente.
+\DeclareOption{sincantidad}{\sincantidadtrue}%  Para no poner el campo de la cantidad.
+\DeclareOption{sinexpandir}{\sinexpandirtrue}%  No expande ninguna de las dos partes de la factura.
+\DeclareOption{sinfirmas}{\sinfirmastrue}%  No agrega los espacios para firmar.
+\DeclareOption{sinivaexpresado}{\sinivaexpresadotrue}%  Cuando no se cobra IVA y tampoco se quiere que aparezca la totalización del IVA.
+\DeclareOption{siniva}{\sinivatrue}%  No cobra IVA.
+\DeclareOption{sinlineashe}{\sinlineashetrue}%  Estilo 'sinlineashe'.
+\DeclareOption{sinlineashi}{\sinlineashitrue}%  Estilo 'sinlineashi'.
+\DeclareOption{sinlineash}{\sinlineashtrue}%  Estilo 'sinlineash'.
+\DeclareOption{sinlineasve}{\sinlineasvetrue}%  Estilo 'sinlineasve'.
+\DeclareOption{sinlineasvi}{\sinlineasvitrue}%  Estilo 'sinlineasvi'.
+\DeclareOption{sinlineasv}{\sinlineasvtrue}%  Estilo 'sinlineasv'.
+\DeclareOption{sinmarcas}{\sinmarcastrue}%  Para evitar que aparezcan los caracteres especiales cuando la descripción es larga.
+\DeclareOption{sinnumero}{\sinnumerotrue}%  Escribir el texto de la denominación del documento pero sin escribir el número.
+\DeclareOption{sinreverso}{\sinreversotrue}%  Para no imprimir el reverso de la factura.
+\DeclareOption{sintotales}{\sintotalestrue}%  No escribe los totales al final, por ejemplo para cotizaciones de productos similares.
+\DeclareOption{soloreporte}{\soloreportetrue}%  Para imprimir sólo el reporte.
+\DeclareOption{subtotal}{\subtotaltrue}%  Para la columna extra del subtotal antes del descuento.
+\DeclareOption{todosiva}{\todosivatrue}%  Con esta opción salen todos los IVA así valgan cero.
+\DeclareOption{twoside}{\twosidetrue}%  Opción 'twoside' de article para los reportes.
+\DeclareOption{unafirma}{\unafirmatrue}%  No agrega el espacio para que firme quien recibe.
+\DeclareOption{vencimiento}{\vencimientotrue}%  Escribe fecha de vencimiento, aún con facturas sin crédito.
 
 \ProcessOptions\relax
 
 \LoadClass[12pt]{article}
 
+%% Cargamos algunos paquetes siempre necesarios.
 \RequirePackage{xparse}%  Algunos comandos los definimos con \NewDocumentCommand.
 \RequirePackage[absolute]{textpos}%  Es necesario 'textpos' para colocar texto en ubicaciones arbitrarias.
-\RequirePackage{geometry}%  'geometry' para ajustar todos los márgenes.
 \RequirePackage{eso-pic}%  Para el comando \AddToShipoutPicture.
 \RequirePackage{xstring}%  Lo usamos sólo para tomar el menos al principio de una longitud.
 \RequirePackage{calc}%  'calc' para hacer aritmética con las dimensiones.
@@ -2214,83 +2181,254 @@
 \DTMfdef{ddmmyyyy}#1#2#3#4#5#6#7#8&{\DTMs{#5#6#7#8-#3#4-#1#2}}
 \DTMfdef{mm-dd-yyyy}#1-#2-#3&{\DTMs{#3-#1-#2}}
 
-\AtEndPreamble{\DTMsetstyle{\@FormatoFecha}\DTMsetup{datesep=\@FechaSeparadores}\gdef\DTMinformat{\@FormatoFechaEntrada}}
-\def\@Fecha{\DTMusedate{FechaEmision}}
+\AtEndPreamble{
+ % Establecemos los parámetros y macros relativas a la fecha.
+ \DTMsetstyle{\@FormatoFecha}\DTMsetup{datesep=\@FechaSeparadores}\gdef\DTMinformat{\@FormatoFechaEntrada}
+ 
+ % Tomamos las acciones pertinentes dependiendo de las opciones de la clase (o condicionales activados en el preámbulo que cambian las opciones de la clase)
+ \ifprefactura
+  \ifcotizacion
+   \prefacturafalse
+   \cotizacionfalse
+   \CLASSWARNING{Las opciones 'prefactura' y 'cotizacion' no son compatibles. Sin efecto ambas opciones}
+  \else
+   \denomtrue\setcounter{@Firmas}{0}
+  \fi
+ \fi
+ \ifcotizacion\denomtrue\setcounter{@Firmas}{1}\fi
 
-%% Una vez definido todo en el preámbulo los comandos usados para definir campos servirán para mostrar el campo que se definió con ese comando.
-\AtEndPreamble{%
- \def\RazonSocial{\@RazonSocial}
- \let\Nombre\RazonSocial
- \def\RIF{\@RIF}
- \let\CI\RIF
- \def\Direccion{\@Direccion}
- \def\Telefono{\@Telefono}
- \def\Email{\@Email}
- \def\Contacto{\@Contacto}
- \def\Emisor{\@Emisor}
- \def\Conforme{\@Conforme}
- \def\Proveedor{\@Proveedor}
- \def\Credito{\@Credito}
- \def\Num{\@Num}
- \def\NumSerieControl{\@NumSerieControl}
- \def\NumControl{\@NumControl}
- \def\Condiciones{\@Condiciones}
- \def\Resumen{\@Resumen}
- \def\NotaPrevia{\@NotaPrevia}
- \def\NotaInterna{\@NotaInterna}
- \def\NotaExterna{\@NotaExterna}}
+ \ifsinlineasv\booltrue{SinLineasVertExt}\booltrue{SinLineasVertInt}\fi
+ \ifsinlineasvi\booltrue{SinLineasVertInt}\fi
+ \ifsinlineasve\booltrue{SinLineasVertExt}\fi
+ \ifsinlineash\booltrue{SinLineasHoriExt}\booltrue{SinLineasHoriInt}\fi
+ \ifsinlineashi\booltrue{SinLineasHoriInt}\fi
+ \ifsinlineashe\booltrue{SinLineasHoriExt}\fi
 
-\AtBeginDocument{%  Efectúa distintos chequeos.
- \if at reporte
-  \ifdefvoid{\@Num}{\CLASSWARNING{No se especificó el número de la factura. Puede dar error si el título del reporte no se especifica que aparezca en las cabeceras}}{}%
-  \ifdefvoid{\@Proveedor}{%
-   \ifdefvoid{\@Emisor}
-    {\CLASSERROR{Hay que definir el nombre del proveedor cuando se emite un reporte}}%
-    {\CLASSWARNING{Se toma el emisor como el proveedor por no haberse especificado este último}%
-    \let\@Proveedor=\@Emisor}}
-   {}%
+ \ifdosfirmas
+  \setcounter{@Firmas}{2}
+  \ifunafirma
+   \unafirmafalse
+   \ifsinfirmas
+    \sinfirmasfalse
+    \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'dosfirmas'}
+   \else
+    \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'dosfirmas'}
+   \fi
+  \else
+   \ifsinfirmas
+    \sinfirmasfalse
+    \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'dosfirmas'}
+   \fi
+  \fi
  \fi
- \ifdefvoid{\@RazonSocial}{\CLASSERROR{Hay que definir la razón social}}{}%
- \if at factura
-  \ifdefvoid{\@RIF}{\CLASSERROR{Hay que definir el R.I.F}}{}%
-  \ifdefvoid{\@Direccion}{\CLASSERROR{Hay que definir la dirección fiscal}}{}%
-  \ifdefvoid{\@Telefono}{\CLASSWARNING{Pudiera definirse un número telefónico}}{}%
-  \ifdefvoid{\@Email}{\CLASSWARNING{Pudiera definirse una dirección de correo electrónico}}{}%
-  \ifdefvoid{\@Condiciones}{\CLASSWARNING{Pudieran definirse las condiciones del documento}}{}%
-  \DTMifsaveddate{FechaEmision}{}{%
-   \CLASSWARNING{No se especificó fecha. Asumiendo la fecha de hoy}%
-   \DTMsavedate{FechaEmision}{\the\year-\the\month-\the\day}}%
-  \if at cotizacion
-   \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para cotizacion se recomienda agregar el fondo}}{}%
+ \ifunafirma
+  \setcounter{@Firmas}{1}
+  \ifsinfirmas
+   \sinfirmasfalse
+   \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'unafirma'}
   \fi
-  \if at prefactura
-   \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para prefactura se recomienda agregar el fondo}}{}%
+ \fi
+ \ifsinfirmas\setcounter{@Firmas}{0}\fi 
+ 
+ \ifdcu
+  \@cdufalse\ducfalse
+  \booltrue{DCU}\boolfalse{DUC}
+  \booltrue{PrimeroDescripcion}
+ \fi
+ \ifduc
+  \ifdcu
+   \boolfalse{PrimeroDescripcion}\boolfalse{DCU}\dcufalse\ducfalse\@cdutrue
+   \CLASSWARNING{Las opciones 'duc' y 'dcu' no son compatibles. Sin efecto ambas opciones}
+  \else
+   \ductrue\@cdufalse\dcufalse
+   \booltrue{DUC}\boolfalse{DCU}
+   \booltrue{PrimeroDescripcion}
   \fi
-  \if at sinnumero
-   \if at cotizacion
-   \else
-    \CLASSERROR{La opción para no poner el número sólo es compatible con las cotizaciones}%
-   \fi
+ \fi
+ \ifnumitem\booltrue{NumItem}\fi
+ \ifsincantidad
+  \booltrue{SinCantidad}
+  \ifdcu
+   \dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDescripcion}
+   \CLASSWARNING{La opción 'sincantidad' no es compatible con 'dcu'. Sin efecto opción 'dcu'}
   \fi
-  \if at denom
-   \if at sinnumero
-   \else
-    \ifdefvoid{\@Num}{\CLASSERROR{Hay que definir el número de la factura}}{}%
-   \fi
+  \ifduc
+   \ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDescripcion}
+   \CLASSWARNING{La opción 'sincantidad' no es compatible con 'duc'. Sin efecto opción 'duc'}
   \fi
  \fi
- \ifdefvoid{\@Contacto}{\if at Nombre\else\CLASSWARNING{Pudiera definirse una persona de contacto}\fi}{}%
-}
+ \ifdescuentos\booltrue{Descuentos}\fi
+ \ifiva\impdesctrue\booltrue{IVA}\fi
+ \ifsubtotal
+  \ifdescuentos
+   \booltrue{Subtotal}
+  \else
+   \CLASSWARNING{La opción 'subtotal' no aplica sin descuentos individuales. Sin efecto opción 'subtotal'}
+  \fi
+ \fi
 
+ \ifsinnumero\denomtrue\fi
+ \ifsintotales
+  \iffilas
+   \filasfalse
+   \CLASSWARNING{La opción 'sintotales' no aplica para el modo de totalización en filas. Sin efecto opción 'filas'}
+  \fi
+  \ifcotizacion
+  \else
+   \CLASSWARNING{La opción 'sintotales' no debe usarse en facturas sino en cotizaciones. No es válida una factura sin totales}
+  \fi
+ \fi
+
+ \ifcentrado
+  \iffilas
+  \else
+   \centradofalse
+   \CLASSWARNING{La opción 'centrado' no es compatible con el modo de totalización en columnas. Sin efecto opción 'centrado'}
+  \fi
+ \fi
+ \ifagrupado
+  \iffilas
+   \agrupadofalse
+   \CLASSWARNING{La opción 'agrupado' no es compatible con el modo de totalización en filas. Sin efecto opción 'agrupado'}
+  \fi
+ \fi
+
+ \ifelectro
+  \booltrue{Electro}
+  \gdef\@NotaInterna{\@TextoDescuentoPresidencial}
+  \CLASSWARNING{Ya no está vigente el descuento en la alícuota general. Aplicándolo igual como se pidió}
+  \CLASSINFO{Se estableció el texto aclaratorio del descuento presidencial como 'nota interna'}
+  \iffilas
+   \filasfalse
+   \CLASSWARNING{La opción 'electro' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'}
+  \fi
+ \fi
+
+ \iftodosiva \@BIRtrue \@BIAtrue \@Exentotrue \Gtrue \fi
+ \ifsiniva\AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}\fi
+ \ifsinivaexpresado
+  \iffilas
+   \filasfalse
+   \CLASSWARNING{La opción 'sinivaexpresado' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'}
+  \else
+   \AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}
+  \fi
+ \fi
+
+ \iflinea
+  \RequirePackage{zref-savepos}
+  \ifexpandecuadro
+  \else
+   \CLASSWARNING{La opción 'linea' requiere la opción 'expandecuadro'. Activando la opción 'expandecuadro'}
+  \fi
+ \fi
+ \ifsinmarcas \def\@CaracterCR{\mbox{}} \def\@CaracterCeldasVacias{\mbox{}} \fi
+ \ifnospanish
+ \else
+  \RequirePackage[spanish]{babel}%  Babel en castellano.
+  \RequirePackage[T1]{fontenc}%  Codificación T1 para las tipografías.
+  \IfFileExists{lmodern.sty}{\RequirePackage{lmodern}}{}
+ \fi
+
+ \ifexpandecuadro
+  \ifsinexpandir
+   \expandecuadrofalse
+   \sinexpandirfalse
+   \CLASSWARNING{Las opciones 'expandecuadro' y 'sinexpandir' no son compatibles. Sin efecto ambas opciones}
+  \else
+   \boolfalse{ExpAbajo}
+   \RequirePackage{zref-savepos}[2016/05/21]%  Para guardar la posición en 'Y'.
+  \fi
+ \fi
+ \ifsinexpandir\boolfalse{ExpAbajo}\expandecuadrofalse\fi
+
+ \ifsinreverso\@reversofalse\fi
+ \ifconreporte
+  \@reportetrue
+  \ifsoloreporte
+   \soloreportefalse
+   \CLASSWARNING{La opción 'soloreporte' no es compatible con 'conreporte'. Sin efecto 'soloreporte'}
+  \fi
+ \fi
+ \ifsoloreporte\@reportetrue\@facturafalse\@reversofalse\fi
+
+ \if at reporte
+  \RequirePackage{zref-savepos}% Para la firma, que debe ser cargado aquí siempre que hay reporte porque \FirmaReporte no se ejecuta desde el preámbulo.
+ \fi
+ \ifcsv
+  \if at factura
+   \newwrite\csv \immediate\openout\csv=\jobname.csv
+   \ifsintotales\else\AtEndDocument{\@EscribeTotalesEnCSV}\fi
+  \else
+   \csvfalse
+   \CLASSWARNING{La opción 'csv' require generar la factura. Sin efecto opción 'csv'}
+  \fi
+ \fi
+ 
+ \iftwoside
+  \@twosidetrue\@mparswitchtrue
+ \else
+  \@twosidefalse\@mparswitchfalse
+ \fi
+
+ % Escribimos en el .log las opciones cargadas:
+ \ifagrupado \CLASSINFO{Opción cargada: agrupado}\fi
+ \ifcentradesc \CLASSINFO{Opción cargada: centradesc}\fi
+ \ifcentrado \CLASSINFO{Opción cargada: centrado}\fi
+ \ifconlineasha \CLASSINFO{Opción cargada: conlineasha}\fi
+ \ifconreporte \CLASSINFO{Opción cargada: conreporte}\fi
+ \ifcotizacion \CLASSINFO{Opción cargada: cotizacion}\fi
+ \ifcsv \CLASSINFO{Opción cargada: csv}\fi
+ \ifdcu \CLASSINFO{Opción cargada: dcu}\fi
+ \ifdenom \CLASSINFO{Opción cargada: denom}\fi
+ \ifdescuentos \CLASSINFO{Opción cargada: descuentos}\fi
+ \ifdosfirmas \CLASSINFO{Opción cargada: dosfirmas}\fi
+ \ifduc \CLASSINFO{Opción cargada: duc}\fi
+ \ifelectro \CLASSINFO{Opción cargada: electro}\fi
+ \ifexpandecuadro \CLASSINFO{Opción cargada: expandecuadro}\fi
+ \iffilas \CLASSINFO{Opción cargada: filas}\fi
+ \ifG \CLASSINFO{Opción cargada: G}\fi
+ \ifimpdesc \CLASSINFO{Opción cargada: impdesc}\fi
+ \ifiva \CLASSINFO{Opción cargada: iva}\fi
+ \iflinea \CLASSINFO{Opción cargada: linea}\fi
+ \ifnospanish \CLASSINFO{Opción cargada: nospanish}\fi
+ \ifnumitem \CLASSINFO{Opción cargada: numitem}\fi
+ \ifprefactura \CLASSINFO{Opción cargada: prefactura}\fi
+ \ifsincantidad \CLASSINFO{Opción cargada: sincantidad}\fi
+ \ifsinexpandir \CLASSINFO{Opción cargada: sinexpandir}\fi
+ \ifsinfirmas \CLASSINFO{Opción cargada: sinfirmas}\fi
+ \ifsiniva \CLASSINFO{Opción cargada: siniva}\fi
+ \ifsinivaexpresado \CLASSINFO{Opción cargada: sinivaexpresado}\fi
+ \ifsinlineash \CLASSINFO{Opción cargada: sinlineash}\fi
+ \ifsinlineashe \CLASSINFO{Opción cargada: sinlineashe}\fi
+ \ifsinlineashi \CLASSINFO{Opción cargada: sinlineashi}\fi
+ \ifsinlineasv \CLASSINFO{Opción cargada: sinlineasv}\fi
+ \ifsinlineasve \CLASSINFO{Opción cargada: sinlineasve}\fi
+ \ifsinlineasvi \CLASSINFO{Opción cargada: sinlineasvi}\fi
+ \ifsinmarcas \CLASSINFO{Opción cargada: sinmarcas}\fi
+ \ifsinnumero \CLASSINFO{Opción cargada: sinnumero}\fi
+ \ifsinreverso \CLASSINFO{Opción cargada: sinreverso}\fi
+ \ifsintotales \CLASSINFO{Opción cargada: sintotales}\fi
+ \ifsoloreporte \CLASSINFO{Opción cargada: soloreporte}\fi
+ \ifsubtotal \CLASSINFO{Opción cargada: subtotal}\fi
+ \iftodosiva \CLASSINFO{Opción cargada: todosiva}\fi
+ \iftwoside \CLASSINFO{Opción cargada: twoside}\fi
+ \ifunafirma \CLASSINFO{Opción cargada: unafirma}\fi
+ \ifvencimiento \CLASSINFO{Opción cargada: vencimiento}\fi
+
+ % Cargamos aquí 'geometry' para que sea después de haber establecido 'twoside'.
+ \RequirePackage{geometry}}
+
 %% Escribimos el total como comentario en el .log, y avisamos cuando la fecha no sea la de hoy.
 \AtEndDocument{%
- \DTMsavenow{Ahora}%
- \DTMsaveddatediff{FechaEmision}{Ahora}{\AuxFecha}%
+ \DTMifsaveddate{FechaEmision}{%
+  \DTMsavenow{Ahora}%
+  \DTMsaveddatediff{FechaEmision}{Ahora}{\AuxFecha}}{}%
  \ifnum\AuxFecha=0%
  \else
   \CLASSWARNING{Fecha del documento \@Fecha\space distinta de la fecha de hoy}%
  \fi
- \if at sintotales
+ \ifsintotales
  \else
   \if at factura\CLASSINFO{\@@Total: \space\space\space \Moneda \Total}\fi
  \fi}
@@ -2406,8 +2544,8 @@
 \def\flechaCR{%
  \raisebox{-0.4ex}{%
   \begin{tikzpicture}
-  \draw[line width=0.075ex] (0,0) arc (20:70:0.75ex) + (0,0) arc (-70:-20:0.75ex) ++ (0.8ex,0.55ex) arc (0:-100:1ex);
- \end{tikzpicture}}}
+   \draw[line width=0.075ex] (0,0) arc (20:70:0.75ex) + (0,0) arc (-70:-20:0.75ex) ++ (0.8ex,0.55ex) arc (0:-100:1ex);
+  \end{tikzpicture}}}
 
 %% Separación entre el inicio de una columna en la tabla y el inicio del texto.
 \tabcolsep=0.15cm
@@ -2443,9 +2581,12 @@
  \IfBooleanTF{#1}
   {\AtEndPreamble{\DTMsavedate{FechaEmision}{#2-#3-#4}}}
   {\AtEndPreamble{\DTMsavedatex{FechaEmision}{#2}}}}
+\def\@Fecha{\DTMusedate{FechaEmision}}
+
 \NewDocumentCommand{\FormatoFecha}{o g g}{%
  \IfValueT{#1}{\gdef\@FormatoFechaEntrada{#1}}\IfValueT{#2}{\gdef\@FormatoFecha{#2}}\IfValueT{#3}{\gdef\@FechaSeparadores{#3}}}
-\def\Credito#1{\gdef\@Credito{#1}\@vencimientotrue}
+
+\def\Credito#1{\gdef\@Credito{#1}\vencimientotrue}
 \def\RazonSocial#1{\gdef\@RazonSocial{#1}}
 \def\Nombre#1{\gdef\@RazonSocial{#1}\@Nombretrue}
 \def\RIF#1{\gdef\@RIF{#1}}
@@ -2508,6 +2649,47 @@
 \NewDocumentCommand{\NotaExterna}{+m}{\gdef\@NotaExterna{#1}}
 
 \AtBeginDocument{%
+ % Efectuamos distintos chequeos.
+ \if at reporte
+  \ifdefvoid{\@Num}{\CLASSWARNING{No se especificó el número de la factura. Puede dar error si el título del reporte no se especifica que aparezca en las cabeceras}}{}%
+  \ifdefvoid{\@Proveedor}{%
+   \ifdefvoid{\@Emisor}
+    {\CLASSERROR{Hay que definir el nombre del proveedor cuando se emite un reporte}}%
+    {\CLASSWARNING{Se toma el emisor como el proveedor por no haberse especificado este último}%
+    \let\@Proveedor=\@Emisor}}
+   {}%
+ \fi
+ \ifdefvoid{\@RazonSocial}{\CLASSERROR{Hay que definir la razón social}}{}%
+ \if at factura
+  \ifdefvoid{\@RIF}{\CLASSERROR{Hay que definir el R.I.F}}{}%
+  \ifdefvoid{\@Direccion}{\CLASSERROR{Hay que definir la dirección fiscal}}{}%
+  \ifdefvoid{\@Telefono}{\CLASSWARNING{Pudiera definirse un número telefónico}}{}%
+  \ifdefvoid{\@Email}{\CLASSWARNING{Pudiera definirse una dirección de correo electrónico}}{}%
+  \ifdefvoid{\@Condiciones}{\CLASSWARNING{Pudieran definirse las condiciones del documento}}{}%
+  \DTMifsaveddate{FechaEmision}{}{%
+   \CLASSWARNING{No se especificó fecha. Asumiendo la fecha de hoy}%
+   \DTMsavedate{FechaEmision}{\the\year-\the\month-\the\day}}%
+  \ifcotizacion
+   \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para cotizacion se recomienda agregar el fondo}}{}%
+  \fi
+  \ifprefactura
+   \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para prefactura se recomienda agregar el fondo}}{}%
+  \fi
+  \ifsinnumero
+   \ifcotizacion
+   \else
+    \CLASSERROR{La opción para no poner el número sólo es compatible con las cotizaciones}%
+   \fi
+  \fi
+  \ifdenom
+   \ifsinnumero
+   \else
+    \ifdefvoid{\@Num}{\CLASSERROR{Hay que definir el número de la factura}}{}%
+   \fi
+  \fi
+ \fi
+ \ifdefvoid{\@Contacto}{\if at Nombre\else\CLASSWARNING{Pudiera definirse una persona de contacto}\fi}{}%
+
  % El cálculo de la fecha de vencimiento para cuando haya crédito o fecha de vencimiento explícita.
  \ifdefvoid{\@Credito}
   {\gdef\@FechaVencimiento{\DTMusedate{FechaEmision}}}
@@ -2528,8 +2710,33 @@
  \FPupn\@DescuentoGfactor{100 \@DescuentoGporc{} /}%
  \FPupn\@DescuentoRfactor{100 \@DescuentoRporc{} /}%
  \FPupn\@DescuentoAfactor{100 \@DescuentoAporc{} /}%
- \FPupn\@DescuentoEfactor{100 \@DescuentoEporc{} /}}
+ \FPupn\@DescuentoEfactor{100 \@DescuentoEporc{} /}
 
+ % Una vez definido todo en el preámbulo, los comandos usados para definir campos servirán para mostrar el campo que se definió con ese comando.
+ \def\RazonSocial{\@RazonSocial}%
+ \let\Nombre\RazonSocial
+ \def\RIF{\@RIF}%
+ \let\CI\RIF
+ \def\Direccion{\@Direccion}%
+ \def\Telefono{\@Telefono}%
+ \def\Email{\@Email}%
+ \def\Contacto{\@Contacto}%
+ \def\Emisor{\@Emisor}%
+ \def\Conforme{\@Conforme}%
+ \def\Proveedor{\@Proveedor}%
+ \def\Fecha{\@Fecha}%
+ \def\FechaVencimiento{\@FechaVencimiento}%
+ \def\Credito{\@Credito}%
+ \def\Num{\@Num}%
+ \def\NumSerieControl{\@NumSerieControl}%
+ \def\NumControl{\@NumControl}%
+ \def\Condiciones{\@Condiciones}%
+ \def\Resumen{\@Resumen}%
+ \def\NotaPrevia{\@NotaPrevia}%
+ \def\NotaInterna{\@NotaInterna}%
+ \def\NotaExterna{\@NotaExterna}%
+ \def\TituloReporte{\@TituloReporte}}
+
 %</class>
 %<*class|def>
 %% Posiciones (X,Y) de los objetos: i) fecha, ii) denominación, iii) condiciones, iv) número de control, v) firmas.
@@ -2767,17 +2974,18 @@
 %<*class>
 %% Comando para incluir la firma escaneada en el sitio donde va la línea de la firma del emisor.
 \NewDocumentCommand{\FirmaFactura}{m O{0pt} O{0pt}}{% \FirmaFactura{imagen}[x-corr][y-corr]
- \if at factura
-  \RequirePackage{graphicx}
-  \ifx&#2&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi
-  \ifx&#3&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi
-  \savebox{\@CajaFirmaEmisor}{#1}
-  \AtBeginShipoutNext{%
-   \begin{textblock*}{\@TamLineaFirmas}%
-    (\textwidth+\oddsidemargin+1in-\@TamLineaFirmas/2-\wd\@CajaFirmaEmisor/2-\@PosFirmasXdos+\@FirmaFacturaXcorr,\@PosFirmasY-\ht\@CajaFirmaEmisor-\dp\@CajaFirmaEmisor+\@FirmaFacturaYcorr)%
-    \usebox{\@CajaFirmaEmisor}%
-   \end{textblock*}}%
- \fi}
+ \AtEndPreamble{
+  \if at factura
+   \RequirePackage{graphicx}
+   \ifx&#2&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi
+   \ifx&#3&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi
+   \savebox{\@CajaFirmaEmisor}{#1}
+   \AtBeginShipoutNext{%
+    \begin{textblock*}{\@TamLineaFirmas}%
+     (\textwidth+\oddsidemargin+1in-\@TamLineaFirmas/2-\wd\@CajaFirmaEmisor/2-\@PosFirmasXdos+\@FirmaFacturaXcorr,\@PosFirmasY-\ht\@CajaFirmaEmisor-\dp\@CajaFirmaEmisor+\@FirmaFacturaYcorr)%
+     \usebox{\@CajaFirmaEmisor}%
+    \end{textblock*}}%
+  \fi}}
 
 \NewDocumentCommand{\FirmaReporte}{O{} O{0pt} O{0pt} G{\@Proveedor} O{\@FirmaReportePosX} O{\@FirmaReporteExcesoLinea}}{% \Firma[imagen][x-corr][y-corr]{texto}[posición en X desde la derecha][tamaño linea]
  \renewcommand{\baselinestretch}{1}\selectfont
@@ -2826,20 +3034,22 @@
 
 %% Con \FondoFactura le damos el nombre del archivo que contiene el formato de la factura, por ejemplo para compilaciones con 'prefactura', 'cotizacion' o para incluir una imagen de fondo como 'marca de agua'.
 \newcommand{\FondoFactura}[1]{
- \if at factura
-  \RequirePackage{graphicx}
-  \@FondoFacturatrue
-  \gdef\@FondoFactura{#1}
- \fi}
+ \AtEndPreamble{
+  \if at factura
+   \RequirePackage{graphicx}
+   \@FondoFacturatrue
+   \gdef\@FondoFactura{#1}
+  \fi}}
 
 %% Con \FondoReporte le damos el nombre del archivo que contiene el formato del reporte. Existen dos posibilidades: que dicho fondo salga en todas las páginas o sólo en la primera.
 \NewDocumentCommand{\FondoReporte}{s m}{
- \if at reporte
-  \@FondoReportetrue
-  \RequirePackage{graphicx}
-  \gdef\@FondoReporte{#2}
-  \IfBooleanT{#1}{\@FondoReporteStartrue}% Con * sale en todas las páginas; sin * sale sólo en la primera página.
- \fi}
+ \AtEndPreamble{
+  \if at reporte
+   \@FondoReportetrue
+   \RequirePackage{graphicx}
+   \gdef\@FondoReporte{#2}
+   \IfBooleanT{#1}{\@FondoReporteStartrue}% Con * sale en todas las páginas; sin * sale sólo en la primera página.
+  \fi}}
 
 %% Comando para establecer desde el preámbulo el estilo de página (\pagestyle) del reporte, tanto para la primera página como para las siguientes.
 \NewDocumentCommand{\EstiloPagReporte}{o m}{
@@ -2861,43 +3071,11 @@
 
 \input{factura.def}%  Cargamos los valores predeterminados.
 
-\if at todosiva
- \@BIRtrue
- \@BIAtrue
- \@Exentotrue
- \@Gtrue
-\fi
-
-\if at csv%  Abre el archivo csv.
- \newwrite\csv
- \immediate\openout\csv=\jobname.csv
-\fi
-
-\if at nospanish
-\else
- \RequirePackage[spanish]{babel}%  Babel en castellano.
- \RequirePackage[T1]{fontenc}%  Codificación T1 para las tipografías.
- \IfFileExists{lmodern.sty}{\RequirePackage{lmodern}}{}
-\fi
-
-\if at expandecuadro
- \RequirePackage{zref-savepos}[2016/05/21]%  Para guardar la posición en 'Y'.
-\fi
-
-\if at reporte
- \RequirePackage{zref-savepos}%  Para la firma, que debe ser cargado aquí porque \FirmaReporte no se ejecuta desde el preámbulo.
-\fi
-
-\if at sinmarcas
- \def\@CaracterCR{\mbox{}}
- \def\@CaracterCeldasVacias{\mbox{}}
-\fi
-
 %% Comando para escribir el encabezado en la factura.
 \newcommand\@EncabezadoFactura{%
  \ifdefvoid{\@Resumen}{\@EscribeDatos}{\@EscribeDatosResumen}%
  \vspace*{\@SeparaVertical}%
- \if at expandecuadro\else\vfill\fi}
+ \ifexpandecuadro\else\vfill\fi}
 
 %% Comando para escribir el encabezado en el reporte.
 \newcommand\@EncabezadoReporte{%
@@ -2934,11 +3112,11 @@
 %% http://tex.stackexchange.com/questions/296035/insert-a-special-character-at-each-end-of-line-in-a-paragraph
 %% http://tex.stackexchange.com/questions/248944/how-to-put-before-lines
 \newcommand{\@DescripcionAuxCmd}[2]{%
- \if at impdesc\settowidth{\@TempDimen}{\@EscribeTipoDeImpuesto{#2}}\fi
+ \ifimpdesc\settowidth{\@TempDimen}{\@EscribeTipoDeImpuesto{#2}}\fi
  \savebox{\@CajaPrueba}{%
   \parbox[t]{\linewidth}{%
    \David at XStart
-   \if at centradesc\centering\arraybackslash\fi
+   \ifcentradesc\centering\arraybackslash\fi
    #1%
    \David at XEnd
    \ifdim\@TempDimen=0pt%
@@ -2946,7 +3124,7 @@
     \hfill\kern\@SeparaFinLineaDesc\@EscribeTipoDeImpuesto{#2}%
    \fi
    \par\global\count1=\prevgraf}}%
- \if at sinmarcas
+ \ifsinmarcas
   \usebox{\@CajaPrueba}%
  \else
   \ifnum\count1=1%
@@ -2958,7 +3136,7 @@
    \fi
    \parbox[t]{\linewidth-\@TempDimen-\@SeparaFinLineaDesc}{%
     \David at XStart
-    \if at centradesc\centering\arraybackslash\fi
+    \ifcentradesc\centering\arraybackslash\fi
     #1%
     \David at XEnd
     \par
@@ -2967,7 +3145,7 @@
     \count2=\prevgraf
     \loop
      \ifnum\count0=\count2
-      \if at impdesc
+      \ifimpdesc
        \vskip-\baselineskip
        \mbox{}\hfill
        \rlap{%
@@ -3031,11 +3209,11 @@
 %% Presentación de totales en modo de columnas.
 \newcommand{\@EscribeTotalCol}[1]{%
  \expandafter\FPifeq\csname Desc#1\endcsname{0}%
-  \if at sinivaexpresado\else\@EscribeTotalColBI{#1}\fi
+  \ifsinivaexpresado\else\@EscribeTotalColBI{#1}\fi
  \else
   \@EscribeTotalColSubt{#1}%
   \@EscribeTotalColDesc{#1}%
-  \if at sinivaexpresado\else\@EscribeTotalColBI{#1}\fi
+  \ifsinivaexpresado\else\@EscribeTotalColBI{#1}\fi
  \fi}
 
 %% Forma agupada para la presentación de totales en modo de columnas.
@@ -3048,7 +3226,7 @@
  \if at BIR\if at DescR\@EscribeTotalColDesc{R}\fi\fi
  \if at DescG\@EscribeTotalColDesc{G}\fi
  \if at BIA\if at DescA\@EscribeTotalColDesc{A}\fi\fi
- \if at sinivaexpresado
+ \ifsinivaexpresado
  \else
   \if at Exento\@EscribeTotalColBI{E}\fi
   \if at BIR\@EscribeTotalColBI{R}\fi
@@ -3064,7 +3242,7 @@
  \@LetraTitTotales \csname @@BI#1\endcsname
   \ifx#1E%
   \else
-   \if at G\ \hfill(\csname @Alicuota#1porc\endcsname\%)\else\mbox{}\fi
+   \ifG\ \hfill(\csname @Alicuota#1porc\endcsname\%)\else\mbox{}\fi
   \fi
  & \@LetraNumTotales\numprint{\csname BI#1\endcsname} \\}
 
@@ -3107,7 +3285,7 @@
 \newcommand{\@EscribeTotalFilasBIizq}[1]{%
  \@LetraTitTotales\csname @@BI#1\endcsname
  \ifx#1G%
-  \if at G \ (\@AlicuotaGporc\%)\fi%  Si hay otra B.I. que no sea general, escribimos el porcentaje explícito en la general.
+  \ifG \ (\@AlicuotaGporc\%)\fi%  Si hay otra B.I. que no sea general, escribimos el porcentaje explícito en la general.
  \else
   \ifx#1E%
   \else
@@ -3176,7 +3354,7 @@
  \hspace*{\@SepTotales}\usebox{\@CajaAliG}%
  \if at Exento\hspace*{\@SepTotales}\usebox{\@CajaBIE}\fi
  \hspace*{\@SepTotales}\usebox{\@CajaTotal}%
- \if at centrado\hspace*{\@SepTotales}\fi}
+ \ifcentrado\hspace*{\@SepTotales}\fi}
 
 \newcommand{\@EscribeTotalesFilasGxET}{%
  \if at BIR\hspace*{\@SepTotales}\usebox{\@CajaBIAliR}\fi
@@ -3183,7 +3361,7 @@
  \hspace*{\@SepTotales}\usebox{\@CajaBIAliG}%
  \if at BIA\hspace*{\@SepTotales}\usebox{\@CajaBIAliA}\fi
  \hspace*{\@SepTotales}\if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
- \if at centrado\hspace*{\@SepTotales}\fi}
+ \ifcentrado\hspace*{\@SepTotales}\fi}
 
 \newcommand{\@EscribeTotalesFilasRGA}{%
  \hspace*{\@SepTotales}\usebox{\@CajaBIAliR}%
@@ -3194,12 +3372,12 @@
 \newcommand{\@EscribeTotalesFilasRGAET}{%
  \@EscribeTotalesFilasRGA
  \if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
- \if at centrado\hspace*{\@SepTotales}\fi}
+ \ifcentrado\hspace*{\@SepTotales}\fi}
 
 %% Escribe la letra que designa al tipo de impuesto que aplica al ítem.
 \NewDocumentCommand{\@EscribeTipoDeImpuesto}{m}{%
  % Hay que abrir un grupo de ejecución porque el cambio en la tipografía altera la celda.
- {\if at G
+ {\ifG
    \@LetraTipoIVA
    \ifx#1G\@DenomAlicuotaG\fi
    \ifx#1R\@DenomAlicuotaR\fi
@@ -3302,23 +3480,6 @@
  % Novena y última línea.
  \ifbool{SinLineasVertExt}{}{|}}
 
-%% Comando auxiliar para abrir la tabla del cuadro de la factura y expandir completamente las columnas.
-\edef\@FacturaAuxInicioCmd{\noexpand\begin{tabularx}{\textwidth}{\@FacturaAuxColumnasEval}}
-
-%% Comando auxiliar para abrir el '\multicolumn' para los totales en el modo de columnas y expandir completamente las columnas cuando hay o no barras verticales.
-\edef\@ColumnasMultiColumnTotalesAuxCmd{%
- \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|} r}\begingroup
-   \noexpand\ifdim \noexpand\ht\noexpand\@CajaEspacioVacio=0pt
-   \noexpand\else
-    \noexpand\if at linea\noexpand\zsaveposx{LineaNodoBCoordX}\noexpand\zsaveposy{LineaNodoBCoordY}\noexpand\fi\noexpand\fi% Fijamos la posición (x,y) final para la línea ya que estaremos justo en el punto donde escribimos el total, y hasta allí llega la línea en el modo de columnas.
-    \noexpand\begin{tabular}[b]{@{\noexpand\extracolsep{2\noexpand\tabcolsep}}lr \ifbool{SinLineasVertExt}{}{|}}}
-
-%% Comando auxiliar para abrir el '\multicolumn' de la nota interna y evalúe la presencia o no de las barras verticales.
-\edef\@ColumnasMultiColumnNotaIntAuxCmd{%
- \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|}l\ifbool{SinLineasVertExt}{}{|}}{%
-  \noexpand\parbox[t]{\linewidth-2\tabcolsep-2\arrayrulewidth}{\noexpand\@LetraNotaInterna\noexpand\@NotaInterna\noexpand\strut}}%
-  \noexpand\\}
-
 %% Comando para hacer los cálculos sobre cada ítem y establecer las macros con el contenido de cada ítem introducido.
 \NewDocumentCommand{\@CalculaItem}{m m m o m m}{%
  \addtocounter{NumItem}{1}%
@@ -3327,7 +3488,7 @@
  \ifbool{Descuentos}
   {\ifx\\#6\\\FPset\Dcto{0}\else\FPupn\Dcto{#6 \@DigitosPorc{} round clip}\fi}% Fijamos en 0 el descuento si no se especifica en \Item***.
   {\FPset\Dcto{#6}%
-   \FPifeq\Dcto{0}\else\CLASSWARNING{Se pidió un descuento individual sin dar la opción de la clase 'descuentos'. No se tomará en cuenta.}\fi
+   \FPifeq\Dcto{0}\else\CLASSWARNING{Se pidió un descuento individual sin dar la opción de la clase 'descuentos'. No se tomará en cuenta}\fi
    \FPset\Dcto{0}}% También fijamos en 0 el descuento por si se especifica en \Item*** pero no se pide la opción 'descuentos'.
  \FPupn\PrecioS{#2 \PrecioU{} * \@DigitosMoneda{} round}%
  \FPupn\PrecioT{100 \Dcto{} 100 - / \PrecioS{} * \@DigitosMoneda{} round}%
@@ -3383,502 +3544,519 @@
   \fi
  \fi}
 
-%% Comando auxiliar para la definición del ambiente de la factura; al final de este comando está el texto que va en el enddef del ambiente de la factura.
-\newcommand{\@FacturaAuxCmd}[1]{%
- \if at expandecuadro
-  \setlength{\@EspacioVacioInicial}{\zposy{EspacioVacioInicial}sp}%
-  \setlength{\@EspacioVacioFinal}{\zposy{EspacioVacioFinal}sp}%
-  \global\@EspacioVacioInicial=\@EspacioVacioInicial% Hay que globalizarlas
-  \global\@EspacioVacioFinal=\@EspacioVacioFinal
-  \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{0pt}{%
-   \if at linea
-    \if at LineaCompleta
-     \zsaveposy{LineaNodoBCoordY}%
-    \else
-     \if at LineaHastaTotal
+%% Todo esto tiene que estar dentro de \AtEndPreamble que es cuando \if at factura, \if at reverso e \if at reporte fueron ya aplicadas, y para que se evalúen adecuadamente en su momento las definiciones hechas con \edef.
+\AtEndPreamble{
+ % Comando auxiliar para abrir la tabla del cuadro de la factura y expandir completamente las columnas.
+ \edef\@FacturaAuxInicioCmd{\noexpand\begin{tabularx}{\textwidth}{\@FacturaAuxColumnasEval}}
+
+ % Comando auxiliar para abrir el '\multicolumn' de la nota interna y evalúe la presencia o no de las barras verticales.
+ \edef\@ColumnasMultiColumnNotaIntAuxCmd{%
+  \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|}l\ifbool{SinLineasVertExt}{}{|}}{%
+   \noexpand\parbox[t]{\linewidth-2\tabcolsep-2\arrayrulewidth}{\noexpand\@LetraNotaInterna\noexpand\@NotaInterna\noexpand\strut}}%
+   \noexpand\\}
+
+ % Comando auxiliar para abrir el '\multicolumn' para los totales en el modo de columnas y expandir completamente las columnas cuando hay o no barras verticales.
+ \edef\@ColumnasMultiColumnTotalesAuxCmd{%
+  \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|} r}\begingroup
+    \noexpand\ifdim \noexpand\ht\noexpand\@CajaEspacioVacio=0pt
+    \noexpand\else
+     \noexpand\iflinea\noexpand\zsaveposx{LineaNodoBCoordX}\noexpand\zsaveposy{LineaNodoBCoordY}\noexpand\fi\noexpand\fi% Fijamos la posición (x,y) final para la línea ya que estaremos justo en el punto donde escribimos el total, y hasta allí llega la línea en el modo de columnas.
+     \noexpand\begin{tabular}[b]{@{\noexpand\extracolsep{2\noexpand\tabcolsep}}lr \ifbool{SinLineasVertExt}{}{|}}}
+
+ % Comando auxiliar para la definición del ambiente de la factura; al final de este comando está el texto que va en el enddef del ambiente de la factura.
+ \newcommand{\@FacturaAuxCmd}[1]{%
+  \ifexpandecuadro
+   \setlength{\@EspacioVacioInicial}{\zposy{EspacioVacioInicial}sp}%
+   \setlength{\@EspacioVacioFinal}{\zposy{EspacioVacioFinal}sp}%
+   \global\@EspacioVacioInicial=\@EspacioVacioInicial% Hay que globalizarlas
+   \global\@EspacioVacioFinal=\@EspacioVacioFinal
+   \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{0pt}{%
+    \iflinea
+     \if at LineaCompleta
+      \zsaveposy{LineaNodoBCoordY}%
      \else
-      \zsaveposx{LineaNodoACoordX}\mbox{}\hfill \zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}%
+      \if at LineaHastaTotal
+      \else
+       \zsaveposx{LineaNodoACoordX}\mbox{}\hfill \zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}%
+      \fi
      \fi
+    \fi}}%
+   \ifdim \ht\@CajaEspacioVacio=0pt \global\lineafalse \fi
+  \fi
+
+  \ifx\undefined\Total\relax\else\CLASSERROR{Parece ya haberse usado un entorno de factura}\fi
+  %
+  % Comandos \David at SavePos, \David at XStart, \David at XEnd, \David at XPad, \David at XLeft y \David at XRight para poder manejar el salto de línea en las columnas adyacentes a la columna 'X' del tabularx (la descripción), cuando esta ocupa más que una línea.
+  % Gracias a David Carlisle (Thanks to David Carlisle).
+  % http://tex.stackexchange.com/questions/111203/tabularx-bottom-alignment-on-r-or-l-columns-when-x-column-wraps
+  \def\David at SavePos##1{\leavevmode\pdfsavepos\write\@auxout{\gdef\noexpand##1{\the\pdflastypos sp}}}%
+  \def\David at XStart{\expandafter\David at SavePos\csname save at start@\romannumeral\value{NumItem}\endcsname}%
+  \def\David at XEnd{\expandafter\David at SavePos\csname save at end@\romannumeral\value{NumItem}\endcsname}%
+  \def\David at XPad##1##2##3{%
+   \vtop{%
+    \baselineskip\normalbaselineskip
+    ##2%
+    \expandafter
+    \ifx\csname save at start@##1\endcsname
+     \relax
+    \else
+     \dimen@\csname save at start@##1\endcsname\relax
+     \loop
+      \ifdim\dimen@>\csname save at end@##1\endcsname
+      \advance\dimen at -\baselineskip
+      \settowidth{\@TempDimen}{##3}%
+       \ifdim\@TempDimen=0pt\settowidth{\@TempDimen}{##2}\fi
+      \hbox{\parbox{\@TempDimen}{\@CaracterCeldasVacias}}%
+     \repeat
     \fi
-   \fi}}%
-  \ifdim \ht\@CajaEspacioVacio=0pt \global\@lineafalse \fi
- \fi
- 
- \ifx\undefined\Total\relax\else\CLASSERROR{Parece ya haberse usado un entorno de factura}\fi
- %
- % Comandos \David at SavePos, \David at XStart, \David at XEnd, \David at XPad, \David at XLeft y \David at XRight para poder manejar el salto de línea en las columnas adyacentes a la columna 'X' del tabularx (la descripción), cuando esta ocupa más que una línea.
- % Gracias a David Carlisle (Thanks to David Carlisle).
- % http://tex.stackexchange.com/questions/111203/tabularx-bottom-alignment-on-r-or-l-columns-when-x-column-wraps
- \def\David at SavePos##1{\leavevmode\pdfsavepos\write\@auxout{\gdef\noexpand##1{\the\pdflastypos sp}}}%
- \def\David at XStart{\expandafter\David at SavePos\csname save at start@\romannumeral\value{NumItem}\endcsname}%
- \def\David at XEnd{\expandafter\David at SavePos\csname save at end@\romannumeral\value{NumItem}\endcsname}%
- \def\David at XPad##1##2##3{%
-  \vtop{%
-   \baselineskip\normalbaselineskip
-   ##2%
-   \expandafter
-   \ifx\csname save at start@##1\endcsname
-    \relax
+    ##3}}%
+  \def\David at XLeft##1{\David at XPad{\romannumeral\value{NumItem}}{\hbox{##1}}{}}%
+  \def\David at XRight##1{\David at XPad{\romannumeral\value{NumItem}}{}{\hbox{##1}}}%
+  %
+  % Caja auxiliar para el caracter de retorno de carro y poder saber si tamaño en el campo de la descripción.
+  \savebox{\@CajaCaracterCR}{\@LetraItems\@CaracterCR}
+  %
+  % Comando para fijar la separación extra final de cada item, lo cual viene dado por la cantidad de líneas de la descripción,
+  % que está alojado en \count1, definido en \@DescripcionAuxCmd.
+  \def\@CalculaSeparaItemsExtraFinal{%
+   \setlength{\@SeparaItemsExtraFinal}{\numexpr\the\count1\normalbaselineskip-\normalbaselineskip+\@SeparaItemsExtra}%
+   \global\@SeparaItemsExtraFinal=\@SeparaItemsExtraFinal}
+  %
+  % Comando interno general para agregar cualquier ítem.
+  \NewDocumentCommand{\@ITEM}{m m m o m m}{%
+   % 1. [R|G|A|E|X]; 2. cantidad; 3. descripción; 4. descripción para el csv (entre corchetes); 5. p/u; 6. dcto.
+   \@CalculaItem{##1}{##2}{##3}{##5}{##6}%
+   % Si no es el primer ítem, entonces hace falta \\ para terminar el ítem anterior.
+   \ifnum\value{NumItem}=1% Aquí, \@CalculaItem aumenta en 1 el contador NumItem, que si vale 1 significa que aún no hemos procesado la línea 1, es decir, no hay que hacer el salto de línea. La última línea se termina en otro lado.
    \else
-    \dimen@\csname save at start@##1\endcsname\relax
-    \loop
-     \ifdim\dimen@>\csname save at end@##1\endcsname
-     \advance\dimen at -\baselineskip
-     \settowidth{\@TempDimen}{##3}%
-      \ifdim\@TempDimen=0pt\settowidth{\@TempDimen}{##2}\fi
-     \hbox{\parbox{\@TempDimen}{\@CaracterCeldasVacias}}%
-    \repeat
+    \@CalculaSeparaItemsExtraFinal
+    \\[\@SeparaItemsExtraFinal]
+    \ifconlineasha\hline\fi% Líneas para separar cada ítem, si hiciera falta.
    \fi
-   ##3}}%
- \def\David at XLeft##1{\David at XPad{\romannumeral\value{NumItem}}{\hbox{##1}}{}}%
- \def\David at XRight##1{\David at XPad{\romannumeral\value{NumItem}}{}{\hbox{##1}}}%
- %
- % Caja auxiliar para el caracter de retorno de carro y poder saber si tamaño en el campo de la descripción.
- \savebox{\@CajaCaracterCR}{\@LetraItems\@CaracterCR}
- %
- % Comando para fijar la separación extra final de cada item, lo cual viene dado por la cantidad de líneas de la descripción,
- % que está alojado en \count1, definido en \@DescripcionAuxCmd.
- \def\@CalculaSeparaItemsExtraFinal{%
-  \setlength{\@SeparaItemsExtraFinal}{\numexpr\the\count1\normalbaselineskip-\normalbaselineskip+\@SeparaItemsExtra}%
-  \global\@SeparaItemsExtraFinal=\@SeparaItemsExtraFinal}
- %
- % Comando interno general para agregar cualquier ítem.
- \NewDocumentCommand{\@ITEM}{m m m o m m}{%
-  % 1. [R|G|A|E|X]; 2. cantidad; 3. descripción; 4. descripción para el csv (entre corchetes); 5. p/u; 6. dcto.
-  \@CalculaItem{##1}{##2}{##3}{##5}{##6}%
-  % Si no es el primer ítem, entonces hace falta \\ para terminar el ítem anterior.
-  \ifnum\value{NumItem}=1% Aquí, \@CalculaItem aumenta en 1 el contador NumItem, que si vale 1 significa que aún no hemos procesado la línea 1, es decir, no hay que hacer el salto de línea. La última línea se termina en otro lado.
-  \else
-   \@CalculaSeparaItemsExtraFinal
-   \\[\@SeparaItemsExtraFinal]
-   \if at conlineasha\hline\fi% Líneas para separar cada ítem, si hiciera falta.
-  \fi
-  % Primer -opcional- campo: El número del ítem.
-  \ifbool{NumItem}{\David at XLeft{\@NumItemAuxCmd{\mbox{}\hfill \@LetraNumeros \arabic{NumItem}\hfill\mbox{}}}}{}%
-  &
-  % Segundo campo: Acá puede ir la cantidad (cdu) o la descripción (dcu y duc).
-  \ifbool{SinCantidad}{}{%
-   \ifbool{PrimeroDescripcion}
-   {\@DescripcionAuxCmd{##3}{##1}}% dcu y duc.
-   {\David at XLeft{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}}}% cdu.
-  &
-  % Tercer campo: Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc).
-  \ifbool{PrimeroDescripcion}{%
-   \if at dcu
-    \David at XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu.
-   \else
-    \David at XRight{\@PrecioUAuxCmd{%
+   % Primer -opcional- campo: El número del ítem.
+   \ifbool{NumItem}{\David at XLeft{\@NumItemAuxCmd{\mbox{}\hfill \@LetraNumeros \arabic{NumItem}\hfill\mbox{}}}}{}%
+   &
+   % Segundo campo: Acá puede ir la cantidad (cdu) o la descripción (dcu y duc).
+   \ifbool{SinCantidad}{}{%
+    \ifbool{PrimeroDescripcion}
+    {\@DescripcionAuxCmd{##3}{##1}}% dcu y duc.
+    {\David at XLeft{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}}}% cdu.
+   &
+   % Tercer campo: Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc).
+   \ifbool{PrimeroDescripcion}{%
+    \ifdcu
+     \David at XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu.
+    \else
+     \David at XRight{\@PrecioUAuxCmd{%
+      \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
+      \else
+       \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU}
+      \fi}}% duc.
+    \fi}
+   {\@DescripcionAuxCmd{##3}{##1}}% cdu.
+   &
+   % Cuarto campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc).
+   \FPifeq\PrecioU{##5}\else\CLASSWARNING{Se está introduciendo un precio con más de dos decimales: (##3 - ##5. Redondeado a \PrecioU)}{}\fi% Advertimos cuando el precio unitario tiene más de dos decimales.
+   \ifbool{SinCantidad}{}{%
+    \ifduc
+     \David at XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% duc.
+    \else
+     \David at XRight{\@PrecioUAuxCmd{%
+      \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
+      \else
+       \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU}
+      \fi}}% dcu y cdu.
+    \fi}%
+   & % Quinto -opcional- campo: Subtotal (para luego descuentos).
+   \ifbool{Subtotal}{%
+    \David at XRight{\@PrecioSAuxCmd{%
      \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
      \else
-      \if at impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU}
-     \fi}}% duc.
-   \fi}
-  {\@DescripcionAuxCmd{##3}{##1}}% cdu.
-  &
-  % Cuarto campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc).
-  \FPifeq\PrecioU{##5}\else\CLASSWARNING{Se está introduciendo un precio con más de dos decimales: (##3 - ##5. Redondeado a \PrecioU)}{}\fi% Advertimos cuando el precio unitario tiene más de dos decimales.
-  \ifbool{SinCantidad}{}{%
-   \if at duc
-    \David at XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% duc.
-   \else
-    \David at XRight{\@PrecioUAuxCmd{%
+      \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioS}
+     \fi}}}{}
+   &
+   % Sexto -opcional- campo: Descuento.
+   \ifbool{Descuentos}{%
+    \David at XRight{\@DescuentoAuxCmd{%
      \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
      \else
-      \if at impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU}
-     \fi}}% dcu y cdu.
-   \fi}%
-  & % Quinto -opcional- campo: Subtotal (para luego descuentos).
-  \ifbool{Subtotal}{%
-   \David at XRight{\@PrecioSAuxCmd{%
+      \mbox{}\hfill \@LetraNumeros \numprint{\Dcto}\%\hfill\mbox{}%
+     \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq.
+   &
+   % Séptimo -opcional- campo: IVA.
+   \ifbool{IVA}{%
+    \David at XRight{\@IVAAuxCmd{%
+     \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
+     \else
+      \mbox{}\hfill \@LetraNumeros \numprint{\csname @Alicuota##1porc\endcsname}\%\hfill\mbox{}%
+     \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq.
+   &
+   % Octavo campo: El total.
+   \David at XRight{\@PrecioTAuxCmd{%
     \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
     \else
-     \if at impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioS}
-    \fi}}}{}
-  &
-  % Sexto -opcional- campo: Descuento.
-  \ifbool{Descuentos}{%
-   \David at XRight{\@DescuentoAuxCmd{%
-    \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
+     \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioT}
+    \fi}}%
+   % Escribimos al csv.
+   \ifcsv
+    \IfValueTF{##4}{\@EscribeItemsEnCSV{##1}{##2}{##4}}{\@EscribeItemsEnCSV{##1}{##2}{##3}}%
+   \fi}%
+  %
+  % Comando para escribir en el .csv.
+  \newcommand{\@EscribeItemsEnCSV}[3]{%
+   \ifbool{SinCantidad}
+   {\ifdescuentos
+     \immediate\write\csv{"\unexpanded{##3}","\Dcto","\PrecioT","##1"}%
     \else
-     \mbox{}\hfill \@LetraNumeros \numprint{\Dcto}\%\hfill\mbox{}%
-    \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq.
+     \immediate\write\csv{"\unexpanded{##3}","\PrecioT","##1"}%
+    \fi}
+   {\if at cdu
+     \ifdescuentos
+      \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\Dcto","\PrecioT","##1"}%
+     \else
+      \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\PrecioT","##1"}%
+     \fi
+    \fi
+    \ifdcu
+     \ifdescuentos
+      \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\Dcto","\PrecioT","##1"}%
+     \else
+      \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\PrecioT","##1"}%
+     \fi
+    \fi
+    \ifduc
+     \ifdescuentos
+      \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\Dcto","\PrecioT","##1"}%
+     \else
+      \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\PrecioT","##1"}%
+     \fi
+    \fi}}%
+  %
+  % Usamos la definición de \label at factura dentro del entorno de la factura para que sea local aquí nada más.
+  \let\label\label at factura
+  \@LetraItems% Este es el tipo de letra que tendrán los ítems, y en este tipo de letra se define el \baselineskip de toda la factura.
+  \@FacturaAuxInicioCmd
+  \ifbool{SinLineasHoriExt}{}{\hline}%
+  \@ZERO
+  % Estamos en el número del ítem, si aplicara.
+  \if at LineaDesdeInicio \hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}\fi
+  \ifbool{NumItem}{\@NumItemAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@NumItem \hfill\mbox{}}}{}%
   &
-  % Séptimo -opcional- campo: IVA.
-  \ifbool{IVA}{%
-   \David at XRight{\@IVAAuxCmd{%
-    \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
+  % Avanzamos a la cantidad, o la descripción.
+  \ifbool{SinCantidad}{}{\ifbool{PrimeroDescripcion}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}}}%
+  &% Avanzamos hasta la descripción, la cantidad o el precio unitario.
+  \ifbool{SinCantidad}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}}
+   {\if at cdu \@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}\fi
+    \ifdcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}\fi
+    \ifduc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}\fi}%
+  &% Avanzamos hasta el precio unitario, o la cantidad, o columna fantasma cuando es 'sincantidad'.
+  \ifbool{SinCantidad}{}
+   {%
+    \mbox{}\hfill
+    \ifduc
+     \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}%
     \else
-     \mbox{}\hfill \@LetraNumeros \numprint{\csname @Alicuota##1porc\endcsname}\%\hfill\mbox{}%
-    \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq.
-  &
-  % Octavo campo: El total.
-  \David at XRight{\@PrecioTAuxCmd{%
-   \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
+     \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}%
+    \fi}%
+  &% Avanzamos hasta el subtotal, que puede o no existir,
+  \ifbool{Subtotal}{\@PrecioSAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioS \space (\Moneda)\hfill\mbox{}}}{}%
+  &% Avanzamos hasta el descuento, que puede o no existir.
+  \ifdescuentos \@DescuentoAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Descuento \hfill\mbox{}}\fi
+  &% Avanzamos hasta el IVA, que puede o no existir.
+  \ifbool{IVA}{\@IVAAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@IVA \hfill\mbox{}}}{}
+  &% Avanzamos hasta el precio total.
+  \@PrecioTAuxCmd{\mbox{}\hfill \@LetraTitColumnas \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\Moneda)\hfill\mbox{}}%
+  \if at LineaCompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi
+  \\
+  \ifbool{SinLineasHoriInt}{}{\hline}%
+  %
+  #1% Aquí entran todos los items que el usuario declara dentro del ambiente.
+  \@CalculaSeparaItemsExtraFinal
+  \\[\@SeparaItemsExtraFinal]% El último fin de línea se hace aquí.
+  \ifconlineasha\hline\fi% Se verifica si hace falta una línea horizontal o no.
+  \iffilas
+   % Esto en lugar de \ifexpandecuadro para que no se haga una linea vacía en la tabla cuando la caja está vacía.
+   \ifdim \ht\@CajaEspacioVacio=0pt
+    \ifdefvoid{\@NotaInterna}{%
+     \ifbool{SinLineasHoriExt}{}{%
+      \ifconlineasha\else\hline\fi}% Verificamos si hay que poner la línea horizontal. Si está 'conlineasha' ya salió debido a esta opción.
+     }{\@ColumnasMultiColumnNotaIntAuxCmd\ifbool{SinLineasHoriExt}{}{\hline}}%
    \else
-    \if at impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioT}
-   \fi}}%
-  % Escribimos al csv.
-  \if at csv
-   \IfValueTF{##4}{\@EscribeItemsEnCSV{##1}{##2}{##4}}{\@EscribeItemsEnCSV{##1}{##2}{##3}}%
-  \fi}%
- %
- % Comando para escribir en el .csv.
- \newcommand{\@EscribeItemsEnCSV}[3]{%
-  \ifbool{SinCantidad}
-  {\if at descuentos
-    \immediate\write\csv{"\unexpanded{##3}","\Dcto","\PrecioT","##1"}%
+    \ifbool{PrimeroDescripcion}{&\usebox{\@CajaEspacioVacio}&&&&&&\\}{&&\usebox{\@CajaEspacioVacio}&&&&&\\}%
+    \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}%
+    \ifbool{SinLineasHoriExt}{}{\hline}% Siempre que hay relleno se pone la línea acá.
+   \fi
+  \else
+   \ifbool{SinLineasHoriInt}{}{\ifconlineasha\else\hline\fi}% Línea que cierra los ítems en la tabla.
+   % Agregamos el espacio espúreo.
+   \ifdim \ht\@CajaEspacioVacio=0pt
    \else
-    \immediate\write\csv{"\unexpanded{##3}","\PrecioT","##1"}%
-   \fi}
-  {\if at cdu
-    \if at descuentos
-     \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\Dcto","\PrecioT","##1"}%
+    % Rellenamos la tabla con espacio espúreo, y le agregamos las lineas externas, si aplica.
+    \ifbool{SinLineasVertExt}{\multicolumn{8}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{8}{|c|}{\usebox{\@CajaEspacioVacio}}}\\
+   \fi
+   % Si pedimos sin totalizaciones, entonces cerramos la tabla ya, si no, calculamos los totales y los escribimos
+   \ifsintotales
+   \else
+    % Modo de columnas: Abrimos la tabla para escribir los totales, y le agregamos las líneas verticales externas, si aplica.
+    \@ColumnasMultiColumnTotalesAuxCmd
+    \@CalculaTotalesI
+    \ifagrupado
+     \@EscribeTotalColAgrupado
     \else
-     \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\PrecioT","##1"}%
+     \if at Exento \@EscribeTotalCol{E}\fi
+     \if at BIR\@EscribeTotalCol{R}\ifsinivaexpresado\else\@EscribeTotalColAlicuota{R}\fi\fi
+     \@EscribeTotalCol{G}\ifsinivaexpresado\else\@EscribeTotalColAlicuota{G}\fi
+     \ifbool{Electro}{\@EscribeTotalColAlicuotaGDesc}{}%
+     \if at BIA\@EscribeTotalCol{A}\ifsinivaexpresado\else\@EscribeTotalColAlicuota{A}\fi\fi
     \fi
+    \ifsinivaexpresado\else\cline{2-2}\fi
+    \hfill \@LetraTitTotal\@@Total & \@LetraNumTotal\numprint{\Total}\\
+    \end{tabular}\endgroup
+    \\
+    \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}%
+    \ifbool{SinLineasHoriExt}{}{\hline}%
    \fi
-   \if at dcu
-    \if at descuentos
-     \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\Dcto","\PrecioT","##1"}%
+  \fi
+  \end{tabularx}%
+  %
+  % Generamos la macro \Total vacía para que no dé error en algún posible uso dentro del documento.
+  \ifsintotales\gdef\Total{}\fi
+  % Si pedimos no totalizar (sintotales), la opción filas queda desactivada.
+  \iffilas
+   \@CalculaTotalesI
+   \@LetraNumTotales
+   \vspace*{\@SeparaVertical}\par
+   \ifexpandecuadro\else\vfill\fi
+   \@GeneraCajasTotalesFilas
+   \newbox{\@CajaTotal}%
+   \savebox{\@CajaTotal}{{\@LetraTitTotal\@@Total}: \@LetraNumTotal\numprint{\Total}}%
+   %
+   \ifnum \value{@IVANoGeneral}=0%
+    \newbox{\@CajaGET}%
+    \savebox{\@CajaGET}{\@EscribeTotalesFilasGET}%
+    \ifdim \the\wd\@CajaGET < \textwidth
+     \parbox{\textwidth}{\@EscribeTotalesFilasGET}%
     \else
-     \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\PrecioT","##1"}%
+     \hspace*{\@SepTotales}%
+     \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}%
+     \if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
+     \ifcentrado\hspace*{\@SepTotales}\fi
     \fi
    \fi
-   \if at duc
-    \if at descuentos
-     \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\Dcto","\PrecioT","##1"}%
+   \ifnum \value{@IVANoGeneral}=1%
+    \newbox{\@CajaGxET}%
+    \savebox{\@CajaGxET}{\@EscribeTotalesFilasGxET}%
+    \ifdim \the\wd\@CajaGxET < \textwidth
+     \@EscribeTotalesFilasGxET
     \else
-     \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\PrecioT","##1"}%
-    \fi
-   \fi}}%
- %
- % Usamos la definición de \label at factura dentro del entorno de la factura para que sea local aquí nada más.
- \let\label\label at factura
- \@LetraItems% Este es el tipo de letra que tendrán los ítems, y en este tipo de letra se define el \baselineskip de toda la factura.
- \@FacturaAuxInicioCmd
- \ifbool{SinLineasHoriExt}{}{\hline}%
- \@ZERO
- % Estamos en el número del ítem, si aplicara.
- \if at LineaDesdeInicio \hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}\fi
- \ifbool{NumItem}{\@NumItemAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@NumItem \hfill\mbox{}}}{}%
- &
- % Avanzamos a la cantidad, o la descripción.
- \ifbool{SinCantidad}{}{\ifbool{PrimeroDescripcion}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}}}%
- &% Avanzamos hasta la descripción, la cantidad o el precio unitario.
- \ifbool{SinCantidad}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}}
-  {\if at cdu \@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}\fi
-   \if at dcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}\fi
-   \if at duc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}\fi}%
- &% Avanzamos hasta el precio unitario, o la cantidad, o columna fantasma cuando es 'sincantidad'.
- \ifbool{SinCantidad}{}
-  {%
-   \mbox{}\hfill
-   \if at duc
-    \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}%
-   \else
-    \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}%
-   \fi}%
- &% Avanzamos hasta el subtotal, que puede o no existir,
- \ifbool{Subtotal}{\@PrecioSAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioS \space (\Moneda)\hfill\mbox{}}}{}%
- &% Avanzamos hasta el descuento, que puede o no existir.
- \if at descuentos \@DescuentoAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Descuento \hfill\mbox{}}\fi
- &% Avanzamos hasta el IVA, que puede o no existir.
- \ifbool{IVA}{\@IVAAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@IVA \hfill\mbox{}}}{}
- &% Avanzamos hasta el precio total.
- \@PrecioTAuxCmd{\mbox{}\hfill \@LetraTitColumnas \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\Moneda)\hfill\mbox{}}%
- \if at LineaCompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi
- \\
- \ifbool{SinLineasHoriInt}{}{\hline}%
- %
- #1% Aquí entran todos los items que el usuario declara dentro del ambiente.
- \@CalculaSeparaItemsExtraFinal
- \\[\@SeparaItemsExtraFinal]% El último fin de línea se hace aquí.
- \if at conlineasha\hline\fi% Se verifica si hace falta una línea horizontal o no.
- \if at filas
-  % Esto en lugar de \if at expandecuadro para que no se haga una linea vacía en la tabla cuando la caja está vacía.
-  \ifdim \ht\@CajaEspacioVacio=0pt
-   \ifdefvoid{\@NotaInterna}{%
-    \ifbool{SinLineasHoriExt}{}{%
-     \if at conlineasha\else\hline\fi}% Verificamos si hay que poner la línea horizontal. Si está 'conlineasha' ya salió debido a esta opción.
-    }{\@ColumnasMultiColumnNotaIntAuxCmd\ifbool{SinLineasHoriExt}{}{\hline}}%
-  \else
-   \ifbool{PrimeroDescripcion}{&\usebox{\@CajaEspacioVacio}&&&&&&\\}{&&\usebox{\@CajaEspacioVacio}&&&&&\\}%
-   \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}%
-   \ifbool{SinLineasHoriExt}{}{\hline}% Siempre que hay relleno se pone la línea acá.
-  \fi
- \else
-  \ifbool{SinLineasHoriInt}{}{\if at conlineasha\else\hline\fi}% Línea que cierra los ítems en la tabla.
-  % Agregamos el espacio espúreo.
-  \ifdim \ht\@CajaEspacioVacio=0pt
-  \else
-   % Rellenamos la tabla con espacio espúreo, y le agregamos las lineas externas, si aplica.
-   \ifbool{SinLineasVertExt}{\multicolumn{8}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{8}{|c|}{\usebox{\@CajaEspacioVacio}}}\\
-  \fi
-  % Si pedimos sin totalizaciones, entonces cerramos la tabla ya, si no, calculamos los totales y los escribimos
-  \if at sintotales
-  \else
-   % Modo de columnas: Abrimos la tabla para escribir los totales, y le agregamos las líneas verticales externas, si aplica.
-   \@ColumnasMultiColumnTotalesAuxCmd
-   \@CalculaTotalesI
-   \if at agrupado
-    \@EscribeTotalColAgrupado
-   \else
-    \if at Exento \@EscribeTotalCol{E}\fi
-    \if at BIR\@EscribeTotalCol{R}\if at sinivaexpresado\else\@EscribeTotalColAlicuota{R}\fi\fi
-    \@EscribeTotalCol{G}\if at sinivaexpresado\else\@EscribeTotalColAlicuota{G}\fi
-    \ifbool{Electro}{\@EscribeTotalColAlicuotaGDesc}{}%
-    \if at BIA\@EscribeTotalCol{A}\if at sinivaexpresado\else\@EscribeTotalColAlicuota{A}\fi\fi
-   \fi
-   \if at sinivaexpresado\else\cline{2-2}\fi
-   \hfill \@LetraTitTotal\@@Total & \@LetraNumTotal\numprint{\Total}\\
-   \end{tabular}\endgroup
-   \\
-   \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}%
-   \ifbool{SinLineasHoriExt}{}{\hline}%
-  \fi
- \fi
- \end{tabularx}%
- %
- % Generamos la macro \Total vacía para que no dé error en algún posible uso dentro del documento.
- \if at sintotales\gdef\Total{}\fi
- % Si pedimos no totalizar (sintotales), la opción filas queda desactivada.
- \if at filas
-  \@CalculaTotalesI
-  \@LetraNumTotales
-  \vspace*{\@SeparaVertical}\par
-  \if at expandecuadro\else\vfill\fi
-  \@GeneraCajasTotalesFilas
-  \newbox{\@CajaTotal}%
-  \savebox{\@CajaTotal}{{\@LetraTitTotal\@@Total}: \@LetraNumTotal\numprint{\Total}}%
-  %
-  \ifnum \value{@IVANoGeneral}=0%
-   \newbox{\@CajaGET}%
-   \savebox{\@CajaGET}{\@EscribeTotalesFilasGET}%
-   \ifdim \the\wd\@CajaGET < \textwidth
-    \parbox{\textwidth}{\@EscribeTotalesFilasGET}%
-   \else
-    \hspace*{\@SepTotales}%
-    \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}%
-    \if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
-    \if at centrado\hspace*{\@SepTotales}\fi
-   \fi
-  \fi
-  \ifnum \value{@IVANoGeneral}=1%
-   \newbox{\@CajaGxET}%
-   \savebox{\@CajaGxET}{\@EscribeTotalesFilasGxET}%
-   \ifdim \the\wd\@CajaGxET < \textwidth
-    \@EscribeTotalesFilasGxET
-   \else
-    \hspace*{\@SepTotales}%
-    \if at BIR\usebox{\@CajaBIAliR}\hspace*{\@SepTotales}\fi
-    \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}%
-    \if at BIA\usebox{\@CajaBIAliA}\hspace*{\@SepTotales}\fi
-    \\[\@SeparaFilas]\mbox{}%
-    \if at centrado\hspace*{\@SepTotales}\else\hfill\fi
-    \if at Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}%
-    \if at centrado\hspace*{\@SepTotales}\fi
-   \fi
-  \fi
-  \ifnum \value{@IVANoGeneral}=2%
-  \newbox{\@CajaRGAET}%
-  \savebox{\@CajaRGAET}{\@EscribeTotalesFilasRGAET}%
-   \ifdim \the\wd\@CajaRGAET < \textwidth
-    \@EscribeTotalesFilasRGAET
-   \else
-    \newbox{\@CajaRGA}%
-    \savebox{\@CajaRGA}{\@EscribeTotalesFilasRGA}%
-    \ifdim \the\wd\@CajaRGA < \textwidth
-     \@EscribeTotalesFilasRGA
+     \hspace*{\@SepTotales}%
+     \if at BIR\usebox{\@CajaBIAliR}\hspace*{\@SepTotales}\fi
+     \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}%
+     \if at BIA\usebox{\@CajaBIAliA}\hspace*{\@SepTotales}\fi
      \\[\@SeparaFilas]\mbox{}%
-     \if at centrado\hspace*{\@SepTotales}\else\hfill\fi
+     \ifcentrado\hspace*{\@SepTotales}\else\hfill\fi
      \if at Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}%
-     \if at centrado\hspace*{\@SepTotales}\fi
-    \else% Aquí casi cualquier cosa tiene aspecto feo.
-     \CLASSWARNING{Es mejor no usar la opción de totalización en filas en este caso, o disminuir los tamaños de los tipos de letra para la totalización}%
-     \centering{%
-      \begin{tabular}{r@{\hspace*{\@SeparaMinTotales}}l}
-       \usebox{\@CajaBIAliR} & \usebox{\@CajaBIAliA} \\[\@SeparaFilas]
-       \usebox{\@CajaBIAliG} & \if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
-      \end{tabular}}%
+     \ifcentrado\hspace*{\@SepTotales}\fi
     \fi
    \fi
-  \fi
- \fi
- \par
- \if at expandecuadro
-  \vspace*{-\@EspacioVacioInicial}%
-  \vspace*{\@EspacioVacioFinal}%
-  \zsaveposy{EspacioVacioInicial}%
- \fi
- \vfill
- \if at expandecuadro\zsaveposy{EspacioVacioFinal}\fi
- \vspace*{\@SeparaVertical}\par
- \ifdefvoid{\@NotaExterna}{}{\parbox[t]{\linewidth}{\@LetraNotaExterna\@NotaExterna}\vspace*{\@SeparaVertical}\par}}
-
- \ifbool{SinCantidad}
- % Definamos todos los comandos \Item***. El descuento es opcional; por eso usamos G{0} en \NewDocumentCommand.
- {%
-  \NewDocumentCommand{\Item}{m o m G{0}}{\@ITEM{G}{1}{#1}[#2]{#3}{#4}}% Ítem normal.
-  \NewDocumentCommand{\ItemR}{m o m G{0}}{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA reducido.
-  \NewDocumentCommand{\ItemA}{m o m G{0}}{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA adicional.
-  \NewDocumentCommand{\ItemE}{m o m G{0}}{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{1}{#1}[#2]{#3}{#4}}% Ítem exento de IVA.
-  \NewDocumentCommand{\ItemX}{m o}{\@ITEM{X}{1}{#1}[#2]{0}{0}}% Ítem sin precio.
-  \let\ItemG\Item
-  \if at csv
-   \if at descuentos
-    \immediate\write\csv{"\@@Descripcion","\@@Descuento","\@@Precio \space (\Moneda)","\@@IVA"}%
-   \else
-    \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\Moneda)","\@@IVA"}%
-   \fi
-  \fi}
- {%
-  \NewDocumentCommand{\Item}{m m o m G{0}}{\@ITEM{G}{#1}{#2}[#3]{#4}{#5}}% Ítem normal.
-  \NewDocumentCommand{\ItemR}{m m o m G{0}}{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA reducido.
-  \NewDocumentCommand{\ItemA}{m m o m G{0}}{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA adicional.
-  \NewDocumentCommand{\ItemE}{m m o m G{0}}{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{#1}{#2}[#3]{#4}{#5}}% Ítem exento de IVA.
-  \NewDocumentCommand{\ItemX}{m m o}{\@ITEM{X}{#1}{#2}[#3]{0}{0}}% Ítem sin precio.
-  \let\ItemG\Item
-  \if at csv
-   \if at cdu
-    \if at descuentos
-     \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+   \ifnum \value{@IVANoGeneral}=2%
+   \newbox{\@CajaRGAET}%
+   \savebox{\@CajaRGAET}{\@EscribeTotalesFilasRGAET}%
+    \ifdim \the\wd\@CajaRGAET < \textwidth
+     \@EscribeTotalesFilasRGAET
     \else
-     \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \newbox{\@CajaRGA}%
+     \savebox{\@CajaRGA}{\@EscribeTotalesFilasRGA}%
+     \ifdim \the\wd\@CajaRGA < \textwidth
+      \@EscribeTotalesFilasRGA
+      \\[\@SeparaFilas]\mbox{}%
+      \ifcentrado\hspace*{\@SepTotales}\else\hfill\fi
+      \if at Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}%
+      \ifcentrado\hspace*{\@SepTotales}\fi
+     \else% Aquí casi cualquier cosa tiene aspecto feo.
+      \CLASSWARNING{Es mejor no usar la opción de totalización en filas en este caso, o disminuir los tamaños de los tipos de letra para la totalización}%
+      \centering{%
+       \begin{tabular}{r@{\hspace*{\@SeparaMinTotales}}l}
+        \usebox{\@CajaBIAliR} & \usebox{\@CajaBIAliA} \\[\@SeparaFilas]
+        \usebox{\@CajaBIAliG} & \if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
+       \end{tabular}}%
+     \fi
     \fi
    \fi
-   \if at dcu
-    \if at descuentos
-     \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+  \fi
+  \par
+  \ifexpandecuadro
+   \vspace*{-\@EspacioVacioInicial}%
+   \vspace*{\@EspacioVacioFinal}%
+   \zsaveposy{EspacioVacioInicial}%
+  \fi
+  \vfill
+  \ifexpandecuadro\zsaveposy{EspacioVacioFinal}\fi
+  \vspace*{\@SeparaVertical}\par
+  \ifdefvoid{\@NotaExterna}{}{\parbox[t]{\linewidth}{\@LetraNotaExterna\@NotaExterna}\vspace*{\@SeparaVertical}\par}}
+ 
+  \ifbool{SinCantidad}
+  % Definamos todos los comandos \Item***. El descuento es opcional; por eso usamos G{0} en \NewDocumentCommand.
+  {%
+   \NewDocumentCommand{\Item}{m o m G{0}}{\@ITEM{G}{1}{#1}[#2]{#3}{#4}}% Ítem normal.
+   \NewDocumentCommand{\ItemR}{m o m G{0}}{\global\@BIRtrue\global\Gtrue\@ITEM{R}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA reducido.
+   \NewDocumentCommand{\ItemA}{m o m G{0}}{\global\@BIAtrue\global\Gtrue\@ITEM{A}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA adicional.
+   \NewDocumentCommand{\ItemE}{m o m G{0}}{\global\@Exentotrue\global\Gtrue\@ITEM{E}{1}{#1}[#2]{#3}{#4}}% Ítem exento de IVA.
+   \NewDocumentCommand{\ItemX}{m o}{\@ITEM{X}{1}{#1}[#2]{0}{0}}% Ítem sin precio.
+   \let\ItemG\Item
+   \ifcsv
+    \ifdescuentos
+     \immediate\write\csv{"\@@Descripcion","\@@Descuento","\@@Precio \space (\Moneda)","\@@IVA"}%
     \else
-     \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\Moneda)","\@@IVA"}%
     \fi
+   \fi}
+  {%
+   \NewDocumentCommand{\Item}{m m o m G{0}}{\@ITEM{G}{#1}{#2}[#3]{#4}{#5}}% Ítem normal.
+   \NewDocumentCommand{\ItemR}{m m o m G{0}}{\global\@BIRtrue\global\Gtrue\@ITEM{R}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA reducido.
+   \NewDocumentCommand{\ItemA}{m m o m G{0}}{\global\@BIAtrue\global\Gtrue\@ITEM{A}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA adicional.
+   \NewDocumentCommand{\ItemE}{m m o m G{0}}{\global\@Exentotrue\global\Gtrue\@ITEM{E}{#1}{#2}[#3]{#4}{#5}}% Ítem exento de IVA.
+   \NewDocumentCommand{\ItemX}{m m o}{\@ITEM{X}{#1}{#2}[#3]{0}{0}}% Ítem sin precio.
+   \let\ItemG\Item
+   \ifcsv
+    \if at cdu
+     \ifdescuentos
+      \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \else
+      \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \fi
+    \fi
+    \ifdcu
+     \ifdescuentos
+      \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \else
+      \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \fi
+    \fi
+    \ifduc
+     \ifdescuentos
+      \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \else
+      \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \fi
+    \fi
+   \fi}
+
+ \if at factura
+  % Los descuentos totales no son compatibles -y no creo que lo vayan a ser- con el modo de totalización en filas.
+  \iffilas
+   \if at DescuentoTotal
+    \CLASSWARNING{La opción 'filas' no es compatible con los descuentos totales; sin efecto opción 'filas'}
+    \filasfalse
    \fi
-   \if at duc
-    \if at descuentos
-     \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+  \fi
+  \if at reverso
+  \else
+    \RenewEnviron{reverso}{}
+  \fi
+  \ifcotizacion\def\@Denominacion{\@@DenomCotiza}\else\def\@Denominacion{\@@DenomFactura}\fi%  Fijamos la denominación del documento paras las cotizaciones o facturas, que son casos particulares del modo 'factura'.
+  \expandafter\geometry\expandafter{\@GeometriaFactura}%  La geometría debe aplicarse aquí.
+  \AfterEndPreamble{%
+   \addtolength{\@PosFechaX}{\oddsidemargin+1in}%  Le sumamos el margen izquierdo a las posiciones de las cosas; es importante que se haga en un \AfterEndPreamble antes de que empiecen a escribirse otras cosas en la página.
+   \addtolength{\@PosDenomX}{\oddsidemargin+1in}%
+   \addtolength{\@PosControlX}{\oddsidemargin+1in}%
+   \addtolength{\@PosCondicionesX}{\oddsidemargin+1in}%
+   \addtolength{\@PosFirmasXuno}{\oddsidemargin+1in}%
+   \setlength{\parindent}{0pt}%
+   \setlength{\lineskip}{0pt}%
+   \setlength{\parskip}{0pt plus 1pt}%
+   \expandafter\setlength{\@SepTotales}{\the\@SeparaMinTotales plus 1fill}% \@SeparaMinTotales es el mínimo espacio entre los totales en el modo 'filas', y SepTotales es una dimensión interna, estirable, con ese como su mínimo.
+   \thispagestyle{empty}%
+   \pagenumbering{roman}%
+   \@EncabezadoFactura
+   \@EscribeNotaPrevia}
+   \AtBeginShipoutNext{% Antes abría aquí un \AtBeginShipoutNext cuando había reporte y un \AtEndDocument cuando no. No es necesario eso. También lo modifiqué en \FirmaFactura.
+    \@CargaFondoFactura
+    \@PosicionaFechas
+    \ifdenom\@PosicionaDenom\fi
+    \ifprefactura\@PosicionaNumControl\fi
+    \ifnum\value{@Firmas}=0\else\@PosicionaFirmas\fi
+    \ifdefvoid{\@Condiciones}{}{\@PosicionaCondiciones}}
+  \iflinea
+   % Para determinar las coordenadas de la línea hay que usar \AtBeginShipoutNext porque si no se hace en el 'shipout' de la página se genera un espacio en blanco extra.
+   \AtBeginShipoutNext{\iflinea\@DibujaLinea\fi}
+    \iffilas
+     \ifbool{SinLineasVertInt}{\@LineaCompletatrue}
     \else
-     \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \@LineaHastaTotaltrue\@LineaDesdeIniciotrue
     \fi
-   \fi
-  \fi}
-
-\if at factura
- % Los descuentos totales no son compatibles -y no creo que lo vayan a ser- con el modo de totalización en filas.
- \if at filas
-  \if at DescuentoTotal
-   \CLASSWARNING{La opción 'filas' no es compatible con los descuentos totales; sin efecto opción 'filas'}
-   \@filasfalse
   \fi
- \fi
- \if at reverso
+  %% El comando para la descripción del servicio prestado.
+  \NewDocumentCommand{\Descripcion}{+m}{%
+   {% Abrimos un grupo adicional para que la redefinición del entorno 'tikzpicture' sea local.
+    \@LetraDescripcion
+    % Cuando la línea tiene grosor cero, hacemos que el entorno 'tikzpicture' sea "fake", y redefinimos \node para que obvie los parámetros que le dimos como argumento opcional.
+    \ifdim\@GrosorLineaDescripcion=0pt%
+     \setlength{\@SeparaInternaDescripcion}{0pt}\setlength{\@EsquinaLineaDescripcion}{0pt}\setlength{\@SombraDescripcion}{0pt}%
+     \renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}%
+    \fi
+    \begin{tikzpicture}
+     % Expandimos después para poderle pasar el contenido de la macro como argumento opcional a \node.
+     \expandafter\node\expandafter[\@DescripcionTIKZ]{%
+      \ifbool{ExpAbajo}
+       {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion]
+        {\textwidth-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion}}%
+       {\parbox[t]{\textwidth-\@SombraDescripcion-2\@SeparaInternaDescripcion-2\@GrosorLineaDescripcion}}%
+      {\setlength{\parindent}{0.5cm}%
+       \setlength{\parskip}{2pt plus 8pt}%
+       \ifbool{ExpAbajo}{\vfill}{}%
+        #1%
+       \ifbool{ExpAbajo}{\vfill}{}}}%
+     \ifdim\@GrosorLineaDescripcion=0pt\else ;\fi% El fin del nodo va cuando hay el entorno tikzpicture original.
+    \end{tikzpicture}
+    \par\vspace*{\@SombraDescripcion}}}%
  \else
-   \RenewEnviron{reverso}{}
+  \RenewEnviron{factura}{%
+   \@ZERO
+   \let\label\label at factura
+   \let\@ITEM\@CalculaItem
+   \BODY
+   \@CalculaTotalesI}
+  \RenewEnviron{reverso}{}
+  \NewDocumentCommand{\Descripcion}{+m}{}
  \fi
- \if at cotizacion\def\@Denominacion{\@@DenomCotiza}\else\def\@Denominacion{\@@DenomFactura}\fi%  Fijamos la denominación del documento paras las cotizaciones o facturas, que son casos particulares del modo 'factura'.
- \AtEndPreamble{\expandafter\geometry\expandafter{\@GeometriaFactura}}%  La geometría debe aplicarse aquí.
- \AtBeginDocument{%
-  \addtolength{\@PosFechaX}{\oddsidemargin+1in}%  Le sumamos el margen izquierdo a las posiciones de las cosas; importante que se haga en un \AtBeginDocument antes de que empiecen a escribirse otras cosas que también se agregan a \AtBeginDocument.
-  \addtolength{\@PosDenomX}{\oddsidemargin+1in}%
-  \addtolength{\@PosControlX}{\oddsidemargin+1in}%
-  \addtolength{\@PosCondicionesX}{\oddsidemargin+1in}%
-  \addtolength{\@PosFirmasXuno}{\oddsidemargin+1in}%
-  \setlength{\parindent}{0pt}%
-  \setlength{\lineskip}{0pt}%
-  \setlength{\parskip}{0pt plus 1pt}%
-  \expandafter\setlength{\@SepTotales}{\the\@SeparaMinTotales plus 1fill}% \@SeparaMinTotales es el mínimo espacio entre los totales en el modo 'filas', y SepTotales es una dimensión interna, estirable, con ese como su mínimo.
-  \thispagestyle{empty}%
-  \pagenumbering{roman}%
-  \@EncabezadoFactura
-  \@EscribeNotaPrevia}
-  \AtBeginShipoutNext{% Antes abría aquí un \AtBeginShipoutNext cuando había reporte y un \AtEndDocument cuando no. No es necesario eso. También lo modifiqué en \FirmaFactura.
-   \@CargaFondoFactura
-   \@PosicionaFechas
-   \if at denom\@PosicionaDenom\fi
-   \if at prefactura\@PosicionaNumControl\fi
-   \if at sinfirmas\else\@PosicionaFirmas\fi
-   \ifdefvoid{\@Condiciones}{}{\@PosicionaCondiciones}}
- \if at linea
-  \RequirePackage{zref-savepos}
-  % Para determinar las coordenadas de la línea hay que usar \AtBeginShipoutNext porque si no se hace en el 'shipout' de la página se genera un espacio en blanco extra.
-  \AtBeginShipoutNext{\if at linea\@DibujaLinea\fi}
-   \if at filas
-    \ifbool{SinLineasVertInt}{\@LineaCompletatrue}
-   \else
-    \@LineaHastaTotaltrue\@LineaDesdeIniciotrue
-   \fi
- \fi
- %% El comando para la descripción del servicio prestado.
- \NewDocumentCommand{\Descripcion}{+m}{%
-  {% Abrimos un grupo adicional para que la redefinición del entorno 'tikzpicture' sea local.
-   \@LetraDescripcion
-   % Cuando la línea tiene grosor cero, hacemos que el entorno 'tikzpicture' sea "fake", y redefinimos \node para que obvie los parámetros que le dimos como argumento opcional.
-   \ifdim\@GrosorLineaDescripcion=0pt%
-    \setlength{\@SeparaInternaDescripcion}{0pt}\setlength{\@EsquinaLineaDescripcion}{0pt}\setlength{\@SombraDescripcion}{0pt}%
-    \renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}%
-   \fi
-   \begin{tikzpicture}
-    % Expandimos después para poderle pasar el contenido de la macro como argumento opcional a \node.
-    \expandafter\node\expandafter[\@DescripcionTIKZ]{%
-     \ifbool{ExpAbajo}
-      {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion]
-       {\textwidth-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion}}%
-      {\parbox[t]{\textwidth-\@SombraDescripcion-2\@SeparaInternaDescripcion-2\@GrosorLineaDescripcion}}%
-     {\setlength{\parindent}{0.5cm}%
-      \setlength{\parskip}{2pt plus 8pt}%
-      \ifbool{ExpAbajo}{\vfill}{}%
-       #1%
-      \ifbool{ExpAbajo}{\vfill}{}}}%
-    \ifdim\@GrosorLineaDescripcion=0pt\else ;\fi% El fin del nodo va cuando hay el entorno tikzpicture original.
-   \end{tikzpicture}
-   \par\vspace*{\@SombraDescripcion}}}%
-\else
- \RenewEnviron{factura}{%
-  \@ZERO
-  \let\label\label at factura
-  \let\@ITEM\@CalculaItem
-  \BODY
-  \@CalculaTotalesI}
- \RenewEnviron{reverso}{}
- \NewDocumentCommand{\Descripcion}{+m}{}
-\fi
 
-\if at reporte
- \ifdefvoid{\@InfoPagina}{\let\@InfoPagina\@InfoPaginaNoTitulo}{}%
- \if at factura
- \else
-  \AtEndPreamble{%
-  \expandafter\geometry\expandafter{\@GeometriaReporte}}%  La geometría del reporte debe aplicarse aquí cuando sólo hay reporte, así se puede establecer el tamaño del papel.
- \fi
- \NewEnviron{reporte}{%
+ \if at reporte
+  \ifdefvoid{\@InfoPagina}{\let\@InfoPagina\@InfoPaginaNoTitulo}{}%
   \if at factura
-   \expandafter\newgeometry\expandafter{\@GeometriaReporte}\cleardoublepage%  La geometría debe aplicarse aquí cuando también hay factura, pero no se puede cambiar el tamaño del papel.
+  \else
+   \expandafter\geometry\expandafter{\@GeometriaReporte}%  La geometría del reporte debe aplicarse aquí cuando sólo hay reporte, así se puede establecer el tamaño del papel.
   \fi
-  \let\headwidth\textwidth
-  \@CargaFondoReporte
-  \@EncabezadoReporte
-  \ifdefvoid{\@EstiloPagReporteResto}{%
-   \if at FondoReporteStar%  Si no usamos \EstiloPagReporte entonces se fijará 'soloabajo' cuando se use \FondoReporte* para que sólo use marcas de pie de página, y si no se usó \FondoReporte* entonces se fijará 'plain' que usa cabeceras y pies de página.
-    \pagestyle{soloabajo}%
-   \else
-    \pagestyle{plain}%
-   \fi}
-   {\pagestyle{\@EstiloPagReporteResto}}%  Si usamos \EstiloPagReporte en su argumento obligatorio entonces fijamos ese estilo de página.
-  \ifdefvoid{\@EstiloPagReporteUno}{%
-   \if at FondoReporte%  Si no le damos a \EstiloPagReporte su argumento opcional, entonces se fijará 'solonumpag' como el estilo de página para la primera página, pero solamente si usamos \FondoReporte, ya que el estilo de página predeterminado al usar \FondoReporte* ya se acaba de fijar y no necesita el caso especial de la primera hoja (\thispagestyle).
-    \if at FondoReporteStar
+  \NewEnviron{reporte}{%
+   \if at factura
+    \expandafter\newgeometry\expandafter{\@GeometriaReporte}\cleardoublepage%  La geometría debe aplicarse aquí cuando también hay factura, pero no se puede cambiar el tamaño del papel.
+   \fi
+   \let\headwidth\textwidth
+   \@CargaFondoReporte
+   \@EncabezadoReporte
+   \ifdefvoid{\@EstiloPagReporteResto}{%
+    \if at FondoReporteStar%  Si no usamos \EstiloPagReporte entonces se fijará 'soloabajo' cuando se use \FondoReporte* para que sólo use marcas de pie de página, y si no se usó \FondoReporte* entonces se fijará 'plain' que usa cabeceras y pies de página.
+     \pagestyle{soloabajo}%
     \else
-     \thispagestyle{solonumpag}%
-    \fi
-   \fi}
-   {\thispagestyle{\@EstiloPagReporteUno}}%  Si usamoe el argumento opcional de \EstiloPagReporte establecemos ese estilo de página.
-  \pagenumbering{arabic}%
-  \setlength{\parindent}{0.666cm}%
-  \setlength{\parskip}{4pt plus 6pt minus 2pt}% separación entre párrafos en el reporte.
-  \vskip\baselineskip
-  \BODY\clearpage}% espacio antes de empezar con el reporte, después del título -si lo hubiera-.
-\else
- \NewEnviron{reporte}{}
-\fi
+     \pagestyle{plain}%
+    \fi}
+    {\pagestyle{\@EstiloPagReporteResto}}%  Si usamos \EstiloPagReporte en su argumento obligatorio entonces fijamos ese estilo de página.
+   \ifdefvoid{\@EstiloPagReporteUno}{%
+    \if at FondoReporte%  Si no le damos a \EstiloPagReporte su argumento opcional, entonces se fijará 'solonumpag' como el estilo de página para la primera página, pero solamente si usamos \FondoReporte, ya que el estilo de página predeterminado al usar \FondoReporte* ya se acaba de fijar y no necesita el caso especial de la primera hoja (\thispagestyle).
+     \if at FondoReporteStar
+     \else
+      \thispagestyle{solonumpag}%
+     \fi
+    \fi}
+    {\thispagestyle{\@EstiloPagReporteUno}}%  Si usamoe el argumento opcional de \EstiloPagReporte establecemos ese estilo de página.
+   \pagenumbering{arabic}%
+   \setlength{\parindent}{0.666cm}%
+   \setlength{\parskip}{4pt plus 6pt minus 2pt}% separación entre párrafos en el reporte.
+   \vskip\baselineskip
+   \BODY\clearpage}% espacio antes de empezar con el reporte, después del título -si lo hubiera-.
+ \else
+  \NewEnviron{reporte}{}
+ \fi}
 
 %% Comando para el diseño de la forma libre.
 \newcommand{\@CargaFondoFactura}{%
@@ -4019,7 +4197,7 @@
      \ifdim\@GrosorLineaNotaPrevia=0pt\else ;\fi
    \end{tikzpicture}%
    \par\vspace*{\@SombraNotaPrevia}\vspace*{\@SeparaVertical}%
-   \if at expandecuadro\else\vfill\fi}}}
+   \ifexpandecuadro\else\vfill\fi}}}
 
 %% Comando que coloca la caja para las condiciones, con la posibilidad de TikZ.
 \newcommand{\@EscribeCondiciones}{%
@@ -4064,7 +4242,7 @@
  \setlength{\@LineaNodoXf}{\zposx{LineaNodoBCoordX} sp}%
  \setlength{\@LineaNodoYf}{\zposy{LineaNodoBCoordY} sp}%
  \addtolength{\@LineaNodoYo}{\@EspacioVacioInicial-\@EspacioVacioFinal}%
- \if at filas
+ \iffilas
  \else
   \if at DescG \addtolength{\@LineaNodoYo}{2\baselineskip}\fi
   \if at DescR \if at BIR \addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi
@@ -4071,7 +4249,7 @@
   \if at DescA \if at BIA \addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi
   \if at DescE \if at Exento \addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi
   \addtolength{\@LineaNodoYo}{\baselineskip/2}%
-  \if at sinivaexpresado
+  \ifsinivaexpresado
   \else
    \addtolength{\@LineaNodoYo}{2\baselineskip}%
    \if at BIR\addtolength{\@LineaNodoYo}{2\baselineskip}\fi
@@ -4079,7 +4257,7 @@
    \if at Exento\addtolength{\@LineaNodoYo}{\baselineskip}\fi
   \fi
  \fi
- \if at linea
+ \iflinea
   \begin{textblock*}{\paperwidth-\@LineaNodoXo}(\@LineaNodoXo,\paperheight-\@LineaNodoYo)%
    \begin{tikzpicture}%
     \draw (\@LineaNodoXo,\@LineaNodoYo) -- (\@LineaNodoXf,\@LineaNodoYf);%
@@ -4089,7 +4267,7 @@
 
 %% Escribimos los totales al archivo csv.
 \newcommand{\@EscribeTotalesEnCSV}{%
- \if at csv
+ \ifcsv
   \if at Exento
    \if at DescE
     \immediate\write\csv{Totales: \@@SubtotalE: \Moneda \SubtE^^JTotales: \@@DescuentoE: \Moneda \DescE}%
@@ -4150,7 +4328,7 @@
 %% El diseño de las distintas partes de la hoja.
 \newcommand{\@EstiloFirmas}{
  \@LetraFirmas
- \if at unafirma
+ \ifnum \value{@Firmas}=1
  \else
   \parbox{\@TamLineaFirmas}{
    \rule{\@TamLineaFirmas}{\@GrosorLineaFirmas}
@@ -4159,7 +4337,7 @@
  \hfill
  \parbox{\@TamLineaFirmas}{
   \rule{\@TamLineaFirmas}{\@GrosorLineaFirmas}
-  \centering \ifdefvoid{\@Emisor}{\if at cotizacion \@@Emisor \else \@@Pagado \fi}{\@Emisor}}}
+  \centering \ifdefvoid{\@Emisor}{\ifcotizacion \@@Emisor \else \@@Pagado \fi}{\@Emisor}}}
 
 \newcommand{\@EstiloNotaPrevia}{\@LetraNotaPrevia \@NotaPrevia}
 
@@ -4174,7 +4352,7 @@
 
 \newcommand{\@EstiloDenom}{%
  \@LetraDenom\@Denominacion
- \if at sinnumero
+ \ifsinnumero
  \else
   \space\space{\@LetraNumeracion N\textordmasculine\space\@Num}%
  \fi}
@@ -4184,7 +4362,7 @@
  \setlength{\tabcolsep}{0pt}%
  \@LetraFecha\begin{tabular}{r@{\extracolsep{1ex}}l@{\extracolsep{0pt}}}
  \@@Fecha & \ttfamily\@Fecha \\[.3em]
- \if at vencimiento \@@FechaVencimiento & \ttfamily\@FechaVencimiento \\ \else \vspace*{-.3em}\fi
+ \ifvencimiento \@@FechaVencimiento & \ttfamily\@FechaVencimiento \\ \else \vspace*{-.3em}\fi
  \end{tabular}}
 
 \newcommand{\@InfoPaginaNoTitulo}{\@LetraInfoPagina Reporte correspondiente a la factura n\'umero \@Num \space de fecha \@Fecha}
@@ -4245,6 +4423,8 @@
 %<reptres>%%  (soloreporte) Generamos solamente un reporte
 %<factcinco|factocho>%%  Escribimos factura y reporte, pero sólo producimos la factura
 %
+%<factdiez>%%  Establecemos las opciones de la clase a través de comandos
+%
 %<factuno>%%  Todo con los valores por omisión
 %
 %<reptres>%%  (twoside) El reporte se imprime en las dos caras del papel
@@ -4383,6 +4563,7 @@
 %<factsiete>subtotal,
 %<factcinco>iva,
 %<factcuatro|factcinco|factsiete>filas,
+%<factdiez>filas, % luego queda sin efecto con \filasfalse en el preámbulo
 %<factsiete>centrado,
 %<facttres>agrupado,
 %<factcinco|factseis|factsiete>denom,
@@ -4406,16 +4587,20 @@
 %<factcinco|factseis|factsiete>todosiva,
 %<factnueve>G,
 %<factocho>siniva,
-%<factnueve|factdiez>electro,
+%<factnueve>electro,
+% factdiez también lleva 'electro' pero desde una opción.
 %<factdos>unafirma,
 %<prefac|cotiza>% dosfirmas, % para poner las dos firmas.
 %<prefac>% unafirma, % para poner la firma del emisor.
 %<cotiza>% sinfirmas, % para no poner firmas.
 %<facttres>sinfirmas,
-%<factdiez>vencimiento,
+% factdiez lleva 'vencimiento' pero desde una opción.
 %<factocho>csv,
+%<factdiez>csv, % luego queda sin efecto con \csvfalse en el preámbulo
 %<!factuno>]{factura}
 
+%<factdiez>\electrotrue \vencimientotrue \filasfalse \csvfalse
+%<factdiez>
 \input{factura-ejemplo-aux.tex}% Se incluye para efectos del ejemplo, así tendremos disponible la macro \Ejemplo.
 \usepackage[utf8]{inputenc}
 %<beispiel>\usepackage[official]{eurosym}
@@ -4455,7 +4640,7 @@
 %<beispiel>\def\@@DenomFactura{Rechnung}
 %<beispiel>\def\@@DenomCotiza{Voranschlag}
 %<beispiel>% \LetraNumeracion{\fontsize{14}{14}\bfseries}
-%<beispiel>\renewcommand{\@EstiloDenom}{\@LetraDenom\@Denominacion-\if at sinnumero\else\@LetraNumeracion Nr:\space\@Num\fi}
+%<beispiel>\renewcommand{\@EstiloDenom}{\@LetraDenom\@Denominacion-\ifsinnumero\else\@LetraNumeracion Nr:\space\@Num\fi}
 %<beispiel>\renewcommand{\@EstiloNumControl}{}
 %<beispiel>\makeatother
 
@@ -4551,7 +4736,7 @@
 %<!factuno&!factcinco&!prefac&!reptres>
 %<cotiza>% \Denom{PRESUPUESTO} % También podemos cambiar el nombre del documento.
 %<!factcuatro&!factnueve&!beispiel&!reptres>\Condiciones{Las condiciones del documento...}
-%<factnueve>\Condiciones{La factura se emitió el \DTMusedate{FechaEmision} con crédito de \Credito{} dias, siendo su fecha de vencimiento el \DTMusedate{FechaVencimiento}.}
+%<factnueve>\Condiciones{La factura se emitió el \Fecha{} con crédito de \Credito{} dias, siendo su fecha de vencimiento el \FechaVencimiento.}
 %<beispiel>\Condiciones{Die Zahlungsbedingungen}
 %<factuno|factdos|factcinco|factocho>\Resumen{El resumen opcional}
 %<beispiel>\Resumen{Zusammenfassung}
@@ -4600,6 +4785,8 @@
 %<factcinco|factocho|repuno|repdos|reptres>\begin{reporte}
 %<factcinco|factocho|repuno|repdos|reptres> El reporte - página 1\newpage El reporte - página 2 \newpage El reporte - página 3.
 %<repdos>
+%<factseis|repdos> Se facturaron en total \arabic{NumItem} artículos.
+%<factseis|repdos>
 %<factseis|repdos> En el artículo número \itemref{primeritem} se facturaron \cantref{primeritem} \descref{primeritem} por un valor de \Moneda\puref{primeritem} cada uno, dando un subtotal por este elemento de \Moneda\subtref{primeritem}; el descuento en ese artículo es del \dctoref{primeritem}\%, dando un total de \Moneda\ptref{primeritem}, y esta gravado con IVA de \ivaref{primeritem}\%.
 %<factseis|repdos>
 %<factseis|repdos> La base imponible total de esta factura es de \Moneda\numprint\BIG; el IVA es de \Moneda\numprint\AlicuotaG, el descuento presidencial en el IVA es de \Moneda\numprint\AlicuotaGDesc, y el total final es de \Moneda\numprint\Total.
@@ -4791,6 +4978,7 @@
  \begin{itemize}
   \DescEjemplo
  \end{itemize}
+ \catcode`\%=14
  \catcode`\<=13
  \catcode`\>=13
  }

Modified: trunk/Master/texmf-dist/tex/latex/factura/factura.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/factura/factura.cls	2018-03-13 21:51:13 UTC (rev 46948)
+++ trunk/Master/texmf-dist/tex/latex/factura/factura.cls	2018-03-13 21:59:20 UTC (rev 46949)
@@ -37,7 +37,7 @@
 %% 
 \NeedsTeXFormat{LaTeX2e}[1995/12/01]
 \ProvidesClass{factura}
-[2017/12/11 v3.40
+[2018/03/13 v3.44
 Clase para elaborar facturas legales
 en la República Bolivariana de Venezuela.
 ]
@@ -75,37 +75,55 @@
 \newbool{FirmasYnegativo}% no hay FirmasXnegativo; hay X_inicial y X_final para las firmas.
 
 %% Condicionales relativos a opciones de la clase.
-\newif\if at prefactura
-\newif\if at cotizacion
-\newif\if at nospanish
-\newif\if at sinivaexpresado
-\newif\if at todosiva
-\newif\if at sinfirmas
-\newif\if at unafirma
-\newif\if at filas
-\newif\if at agrupado
-\newif\if at centrado
-\newif\if at descuentos
-\newif\if at denom
-\newif\if at vencimiento
-\newif\if at sinnumero
-\newif\if at sintotales
-\newif\if at conlineasha
-\newif\if at linea
-\newif\if at G
-\newif\if at csv
+\newif\ifagrupado
+\newif\ifcentradesc
+\newif\ifcentrado
+\newif\ifconlineasha
+\newif\ifconreporte
+\newif\ifcotizacion
+\newif\ifcsv
+\newif\ifdcu
+\newif\ifdenom
+\newif\ifdescuentos
+\newif\ifdosfirmas
+\newif\ifduc
+\newif\ifelectro
+\newif\ifexpandecuadro
+\newif\iffilas
+\newif\ifG
+\newif\ifimpdesc
+\newif\ifiva
+\newif\iflinea
+\newif\ifnospanish
+\newif\ifnumitem
+\newif\ifprefactura
+\newif\ifsincantidad
+\newif\ifsinexpandir
+\newif\ifsinfirmas
+\newif\ifsiniva
+\newif\ifsinivaexpresado
+\newif\ifsinlineash
+\newif\ifsinlineashe
+\newif\ifsinlineashi
+\newif\ifsinlineasv
+\newif\ifsinlineasve
+\newif\ifsinlineasvi
+\newif\ifsinmarcas
+\newif\ifsinnumero
+\newif\ifsinreverso
+\newif\ifsintotales
+\newif\ifsoloreporte
+\newif\ifsubtotal
+\newif\iftodosiva
+\newif\iftwoside
+\newif\ifunafirma
+\newif\ifvencimiento
+
+%% Condicionales auxiliares.
 \newif\if at cdu \@cdutrue
-\newif\if at dcu
-\newif\if at duc
-\newif\if at expandecuadro
 \newif\if at factura \@facturatrue
 \newif\if at reverso \@reversotrue
 \newif\if at reporte
-\newif\if at impdesc
-\newif\if at centradesc
-\newif\if at sinmarcas
-
-%% Condicionales auxiliares.
 \newif\if at FondoFactura
 \newif\if at FondoReporte
 \newif\if at FondoReporteStar
@@ -210,134 +228,68 @@
 
 %% Contadores.
 \newcounter{@IVANoGeneral}%  '0' con sólo IVA G, '1' cuando hay IVA R o IVA A, y '2' cuando hay ambos.
+\newcounter{@Firmas}%  '0' para sinfirmas, '1' para unafirma, y '2' para dosfirmas.
+\setcounter{@Firmas}{2}
 \newcounter{NumItem}%  Número del ítem actual, para uso de algunas macros en el cuadro de la factura y para cuando se usa la opción 'numitem'.
 \newcount\AuxFecha
 
+%% Errores, advertencias e informaciones de LaTeX.
 \newcommand{\CLASSERROR}[1]{\ClassError{factura}{** #1. **}{}}
 \newcommand{\CLASSWARNING}[1]{\ClassWarning{factura}{** #1. **}{}}
 \newcommand{\CLASSINFO}[1]{\ClassInfo{factura}{** #1. **}{}}
 
-\DeclareOption{prefactura}{\@prefacturatrue\@denomtrue\@sinfirmastrue}%  La prefactura; con el diseño de la forma libre... para enviar por correo electrónico, fax o imprimir preliminarmente.
-\DeclareOption{cotizacion}{\@cotizaciontrue\@denomtrue\@unafirmatrue}%  Cambia la denominación a 'COTIZACIÓN' y no 'FACTURA'.
-\DeclareOption{nospanish}{\@nospanishtrue}%  No carga babel en castellano ni la codificación T1 de las letras.
-\DeclareOption{sinfirmas}{\@sinfirmastrue}%  No agrega los espacios para firmar.
-\DeclareOption{unafirma}{\@unafirmatrue\@sinfirmasfalse}%  No agrega el espacio para que firme quien recibe.
-\DeclareOption{dosfirmas}{\@unafirmafalse\@sinfirmasfalse}%  Pone las dos firmas para firmar.
-\DeclareOption{descuentos}{\booltrue{Descuentos}\@descuentostrue}%  Para los descuentos individuales.
-\DeclareOption{iva}{\@impdesctrue\booltrue{IVA}}%  Para la columna del IVA.
-\DeclareOption{subtotal}{%  Para la columna extra del subtotal antes del descuento.
- \if at descuentos
-  \booltrue{Subtotal}
- \else
-  \CLASSWARNING{La opción 'subtotal' no aplica sin descuentos individuales. Sin efecto opción 'subtotal'}
- \fi}
-\DeclareOption{denom}{\@denomtrue}%  Agrega el texto con la denominación del documento, para las formas libres que no tienen el número de factura.
-\DeclareOption{vencimiento}{\@vencimientotrue}%  Escribe fecha de vencimiento, aún con facturas sin crédito.
-\DeclareOption{sinnumero}{\@sinnumerotrue\@denomtrue}%  Escribir el texto de la denominación del documento pero sin escribir el número.
-\DeclareOption{G}{\@Gtrue}%  Con esta opción sale la letra 'G' en los items con IVA general, y sale el porcentaje en la base imponible general.
-\DeclareOption{filas}{\@filastrue}%  Estilo de totalización en filas.
-\DeclareOption{sintotales}{\@sintotalestrue%  No escribe los totales al final, por ejemplo para cotizaciones de productos similares.
- \if at filas
-  \CLASSWARNING{La opción 'sintotales' no aplica para el modo de totalización en filas. Sin efecto opción 'filas'}
-  \@filasfalse
- \fi
- \if at cotizacion
- \else
-  \CLASSWARNING{La opción 'sintotales' no debe usarse en facturas sino en cotizaciones. No es válida una factura sin totales}
- \fi}
-\DeclareOption{centrado}{%  Total y exento 'centrado'; sólo para estilo 'filas'
- \if at filas
-  \@centradotrue
- \else
-  \CLASSWARNING{La opción 'centrado' no es compatible con el modo de totalización en columnas. Sin efecto opción 'centrado'}
- \fi}
-\DeclareOption{agrupado}{%  Agrupados los elementos totalizadores en el modo en columnas.
- \if at filas
-  \CLASSWARNING{La opción 'agrupado' no es compatible con el modo de totalización en filas. Sin efecto opción 'agrupado'}
- \else
-  \@agrupadotrue
- \fi}
-\DeclareOption{impdesc}{\@impdesctrue}%  Para el tipo de impuesto en la descripción y no en el precio unitario y total.
-\DeclareOption{centradesc}{\@centradesctrue}%  Para centrar la descripción de cada ítem.
-\DeclareOption{sinmarcas}{\@sinmarcastrue}%  Para evitar que aparezcan los caracteres especiales cuando la descripción es larga.
-\DeclareOption{numitem}{\booltrue{NumItem}}%  Para poner una columna extra al principio con el número del ítem.
-\DeclareOption{dcu}{%  Descripción, luego cantidad y luego precio unitario.
- \@dcutrue\@cdufalse\@ducfalse
- \booltrue{DCU}\boolfalse{DUC}
- \booltrue{PrimeroDescripcion}}
-\DeclareOption{duc}{%  Descripción, luego precio unitario y luego cantidad.
- \if at dcu
-  \CLASSWARNING{Las opciones 'duc' y 'dcu' no son compatibles. Sin efecto ambas opciones}
-  \boolfalse{PrimeroDescripcion}\boolfalse{DCU}\@dcufalse\@cdutrue
- \else
-  \@ductrue\@cdufalse\@dcufalse
-  \booltrue{DUC}\boolfalse{DCU}
-  \booltrue{PrimeroDescripcion}
- \fi}
-\DeclareOption{siniva}{\AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}}%  No cobra IVA.
-\DeclareOption{todosiva}{\@todosivatrue}%  Con esta opción salen todos los IVA así valgan cero.
-\DeclareOption{electro}{%  Parche por el Decreto 3085 de Nikolài.
- \booltrue{Electro}
- \gdef\@NotaInterna{\@TextoDescuentoPresidencial}
- \CLASSINFO{Se estableció el texto aclaratorio del descuento presidencial como 'nota interna'}
- \if at filas
-  \CLASSWARNING{La opción 'electro' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'}
-  \@filasfalse
- \fi}
-\DeclareOption{sinivaexpresado}{%  Cuando no se cobra IVA y tampoco se quiere que aparezca la totalización del IVA.
- \@sinivaexpresadotrue
- \if at filas
-  \CLASSWARNING{La opción 'sinivaexpresado' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'}
-  \@filasfalse
- \else
-  \AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}
- \fi}
-\DeclareOption{sincantidad}{%  Para no poner el campo de la cantidad.
- \booltrue{SinCantidad}
- \if at dcu
-  \CLASSWARNING{La opción 'sincantidad' no es compatible con 'dcu' . Sin efecto opción 'dcu'}
-  \@dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDescripcion}
- \fi
- \if at duc
-  \CLASSWARNING{La opción 'sincantidad' no es compatible con 'duc' . Sin efecto opción 'duc'}
-  \@ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDescripcion}
- \fi}
-\DeclareOption{conlineasha}{\@conlineashatrue}%  Una línea horizontal para cada ítem, como las facturas a mano.
-\DeclareOption{sinlineasv}{%  Estilo 'sinlineasv'.
- \booltrue{SinLineasVertExt}\booltrue{SinLineasVertInt}}
-\DeclareOption{sinlineasvi}{\booltrue{SinLineasVertInt}}%  Estilo 'sinlineasvi'.
-\DeclareOption{sinlineasve}{\booltrue{SinLineasVertExt}}%  Estilo 'sinlineasve'.
-\DeclareOption{sinlineash}{%  Estilo 'sinlineash'.
- \booltrue{SinLineasHoriExt}\booltrue{SinLineasHoriInt}}
-\DeclareOption{sinlineashi}{\booltrue{SinLineasHoriInt}}%  Estilo 'sinlineashi'.
-\DeclareOption{sinlineashe}{\booltrue{SinLineasHoriExt}}%  Estilo 'sinlineashe'.
-\DeclareOption{expandecuadro}{\@expandecuadrotrue\boolfalse{ExpAbajo}}%  Para rellenar con líneas en blanco de manera automática.
-\DeclareOption{sinexpandir}{\boolfalse{ExpAbajo}\@expandecuadrofalse}%  No expande ninguna de las dos partes de la factura.
-\DeclareOption{linea}{%  Para la línea que protege el espacio en blanco.
- \if at expandecuadro
-  \@lineatrue
- \else
-  \CLASSWARNING{La opción 'linea' requiere la opción 'expandecuadro'. Sin efecto opción 'linea'}
- \fi}
-\DeclareOption{conreporte}{\@reportetrue}%  Para imprimir factura y reporte.
-\DeclareOption{soloreporte}{\@reportetrue\@facturafalse\@reversofalse}%  Para imprimir sólo el reporte.
-\DeclareOption{sinreverso}{\@reversofalse}%  Para no imprimir el reverso de la factura.
-\DeclareOption{twoside}{\PassOptionsToClass{twoside}{article}}%  Opción 'twoside' de article para los reportes.
-\DeclareOption{csv}{%  Para la salida en modo csv también.
- \if at factura
-  \@csvtrue
-  \if at sintotales\else\AtEndDocument{\@EscribeTotalesEnCSV}\fi
- \else
-  \CLASSWARNING{La opción 'csv' require generar la factura. Sin efecto opción 'csv'}
- \fi}
+%% Opciones de la clase.
+\DeclareOption{agrupado}{\agrupadotrue}%  Agrupados los elementos totalizadores en el modo en columnas.
+\DeclareOption{centradesc}{\centradesctrue}%  Para centrar la descripción de cada ítem.
+\DeclareOption{centrado}{\centradotrue}%  Total y exento 'centrado'; sólo para estilo 'filas'
+\DeclareOption{conlineasha}{\conlineashatrue}%  Una línea horizontal para cada ítem, como las facturas a mano.
+\DeclareOption{conreporte}{\conreportetrue}%  Para imprimir factura y reporte.
+\DeclareOption{cotizacion}{\cotizaciontrue}%  Cambia la denominación a 'COTIZACIÓN' y no 'FACTURA'.
+\DeclareOption{csv}{\csvtrue}%  Para la salida en modo csv también.
+\DeclareOption{dcu}{\dcutrue}%  Descripción, luego cantidad y luego precio unitario.
+\DeclareOption{denom}{\denomtrue}%  Agrega el texto con la denominación del documento, para las formas libres que no tienen el número de factura.
+\DeclareOption{descuentos}{\descuentostrue}%  Para los descuentos individuales.
+\DeclareOption{dosfirmas}{\dosfirmastrue}%  Pone las dos firmas para firmar.
+\DeclareOption{duc}{\ductrue}%  Descripción, luego precio unitario y luego cantidad.
+\DeclareOption{electro}{\electrotrue}%  Parche por el Decreto 3085 de Nikolài.
+\DeclareOption{expandecuadro}{\expandecuadrotrue}%  Para rellenar con líneas en blanco de manera automática.
+\DeclareOption{filas}{\filastrue}%  Estilo de totalización en filas.
+\DeclareOption{G}{\Gtrue}%  Con esta opción sale la letra 'G' en los items con IVA general, y sale el porcentaje en la base imponible general.
+\DeclareOption{impdesc}{\impdesctrue}%  Para el tipo de impuesto en la descripción y no en el precio unitario y total.
+\DeclareOption{iva}{\ivatrue}%  Para la columna del IVA.
+\DeclareOption{linea}{\lineatrue}%  Para la línea que protege el espacio en blanco.
+\DeclareOption{nospanish}{\nospanishtrue}%  No carga babel en castellano ni la codificación T1 de las letras.
+\DeclareOption{numitem}{\numitemtrue}%  Para poner una columna extra al principio con el número del ítem.
+\DeclareOption{prefactura}{\prefacturatrue}%  La prefactura; con el diseño de la forma libre... para enviar por correo electrónico, fax o imprimir preliminarmente.
+\DeclareOption{sincantidad}{\sincantidadtrue}%  Para no poner el campo de la cantidad.
+\DeclareOption{sinexpandir}{\sinexpandirtrue}%  No expande ninguna de las dos partes de la factura.
+\DeclareOption{sinfirmas}{\sinfirmastrue}%  No agrega los espacios para firmar.
+\DeclareOption{sinivaexpresado}{\sinivaexpresadotrue}%  Cuando no se cobra IVA y tampoco se quiere que aparezca la totalización del IVA.
+\DeclareOption{siniva}{\sinivatrue}%  No cobra IVA.
+\DeclareOption{sinlineashe}{\sinlineashetrue}%  Estilo 'sinlineashe'.
+\DeclareOption{sinlineashi}{\sinlineashitrue}%  Estilo 'sinlineashi'.
+\DeclareOption{sinlineash}{\sinlineashtrue}%  Estilo 'sinlineash'.
+\DeclareOption{sinlineasve}{\sinlineasvetrue}%  Estilo 'sinlineasve'.
+\DeclareOption{sinlineasvi}{\sinlineasvitrue}%  Estilo 'sinlineasvi'.
+\DeclareOption{sinlineasv}{\sinlineasvtrue}%  Estilo 'sinlineasv'.
+\DeclareOption{sinmarcas}{\sinmarcastrue}%  Para evitar que aparezcan los caracteres especiales cuando la descripción es larga.
+\DeclareOption{sinnumero}{\sinnumerotrue}%  Escribir el texto de la denominación del documento pero sin escribir el número.
+\DeclareOption{sinreverso}{\sinreversotrue}%  Para no imprimir el reverso de la factura.
+\DeclareOption{sintotales}{\sintotalestrue}%  No escribe los totales al final, por ejemplo para cotizaciones de productos similares.
+\DeclareOption{soloreporte}{\soloreportetrue}%  Para imprimir sólo el reporte.
+\DeclareOption{subtotal}{\subtotaltrue}%  Para la columna extra del subtotal antes del descuento.
+\DeclareOption{todosiva}{\todosivatrue}%  Con esta opción salen todos los IVA así valgan cero.
+\DeclareOption{twoside}{\twosidetrue}%  Opción 'twoside' de article para los reportes.
+\DeclareOption{unafirma}{\unafirmatrue}%  No agrega el espacio para que firme quien recibe.
+\DeclareOption{vencimiento}{\vencimientotrue}%  Escribe fecha de vencimiento, aún con facturas sin crédito.
 
 \ProcessOptions\relax
 
 \LoadClass[12pt]{article}
 
+%% Cargamos algunos paquetes siempre necesarios.
 \RequirePackage{xparse}%  Algunos comandos los definimos con \NewDocumentCommand.
 \RequirePackage[absolute]{textpos}%  Es necesario 'textpos' para colocar texto en ubicaciones arbitrarias.
-\RequirePackage{geometry}%  'geometry' para ajustar todos los márgenes.
 \RequirePackage{eso-pic}%  Para el comando \AddToShipoutPicture.
 \RequirePackage{xstring}%  Lo usamos sólo para tomar el menos al principio de una longitud.
 \RequirePackage{calc}%  'calc' para hacer aritmética con las dimensiones.
@@ -369,83 +321,254 @@
 \DTMfdef{ddmmyyyy}#1#2#3#4#5#6#7#8&{\DTMs{#5#6#7#8-#3#4-#1#2}}
 \DTMfdef{mm-dd-yyyy}#1-#2-#3&{\DTMs{#3-#1-#2}}
 
-\AtEndPreamble{\DTMsetstyle{\@FormatoFecha}\DTMsetup{datesep=\@FechaSeparadores}\gdef\DTMinformat{\@FormatoFechaEntrada}}
-\def\@Fecha{\DTMusedate{FechaEmision}}
+\AtEndPreamble{
+ % Establecemos los parámetros y macros relativas a la fecha.
+ \DTMsetstyle{\@FormatoFecha}\DTMsetup{datesep=\@FechaSeparadores}\gdef\DTMinformat{\@FormatoFechaEntrada}
 
-%% Una vez definido todo en el preámbulo los comandos usados para definir campos servirán para mostrar el campo que se definió con ese comando.
-\AtEndPreamble{%
- \def\RazonSocial{\@RazonSocial}
- \let\Nombre\RazonSocial
- \def\RIF{\@RIF}
- \let\CI\RIF
- \def\Direccion{\@Direccion}
- \def\Telefono{\@Telefono}
- \def\Email{\@Email}
- \def\Contacto{\@Contacto}
- \def\Emisor{\@Emisor}
- \def\Conforme{\@Conforme}
- \def\Proveedor{\@Proveedor}
- \def\Credito{\@Credito}
- \def\Num{\@Num}
- \def\NumSerieControl{\@NumSerieControl}
- \def\NumControl{\@NumControl}
- \def\Condiciones{\@Condiciones}
- \def\Resumen{\@Resumen}
- \def\NotaPrevia{\@NotaPrevia}
- \def\NotaInterna{\@NotaInterna}
- \def\NotaExterna{\@NotaExterna}}
+ % Tomamos las acciones pertinentes dependiendo de las opciones de la clase (o condicionales activados en el preámbulo que cambian las opciones de la clase)
+ \ifprefactura
+  \ifcotizacion
+   \prefacturafalse
+   \cotizacionfalse
+   \CLASSWARNING{Las opciones 'prefactura' y 'cotizacion' no son compatibles. Sin efecto ambas opciones}
+  \else
+   \denomtrue\setcounter{@Firmas}{0}
+  \fi
+ \fi
+ \ifcotizacion\denomtrue\setcounter{@Firmas}{1}\fi
 
-\AtBeginDocument{%  Efectúa distintos chequeos.
- \if at reporte
-  \ifdefvoid{\@Num}{\CLASSWARNING{No se especificó el número de la factura. Puede dar error si el título del reporte no se especifica que aparezca en las cabeceras}}{}%
-  \ifdefvoid{\@Proveedor}{%
-   \ifdefvoid{\@Emisor}
-    {\CLASSERROR{Hay que definir el nombre del proveedor cuando se emite un reporte}}%
-    {\CLASSWARNING{Se toma el emisor como el proveedor por no haberse especificado este último}%
-    \let\@Proveedor=\@Emisor}}
-   {}%
+ \ifsinlineasv\booltrue{SinLineasVertExt}\booltrue{SinLineasVertInt}\fi
+ \ifsinlineasvi\booltrue{SinLineasVertInt}\fi
+ \ifsinlineasve\booltrue{SinLineasVertExt}\fi
+ \ifsinlineash\booltrue{SinLineasHoriExt}\booltrue{SinLineasHoriInt}\fi
+ \ifsinlineashi\booltrue{SinLineasHoriInt}\fi
+ \ifsinlineashe\booltrue{SinLineasHoriExt}\fi
+
+ \ifdosfirmas
+  \setcounter{@Firmas}{2}
+  \ifunafirma
+   \unafirmafalse
+   \ifsinfirmas
+    \sinfirmasfalse
+    \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'dosfirmas'}
+   \else
+    \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'dosfirmas'}
+   \fi
+  \else
+   \ifsinfirmas
+    \sinfirmasfalse
+    \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'dosfirmas'}
+   \fi
+  \fi
  \fi
- \ifdefvoid{\@RazonSocial}{\CLASSERROR{Hay que definir la razón social}}{}%
- \if at factura
-  \ifdefvoid{\@RIF}{\CLASSERROR{Hay que definir el R.I.F}}{}%
-  \ifdefvoid{\@Direccion}{\CLASSERROR{Hay que definir la dirección fiscal}}{}%
-  \ifdefvoid{\@Telefono}{\CLASSWARNING{Pudiera definirse un número telefónico}}{}%
-  \ifdefvoid{\@Email}{\CLASSWARNING{Pudiera definirse una dirección de correo electrónico}}{}%
-  \ifdefvoid{\@Condiciones}{\CLASSWARNING{Pudieran definirse las condiciones del documento}}{}%
-  \DTMifsaveddate{FechaEmision}{}{%
-   \CLASSWARNING{No se especificó fecha. Asumiendo la fecha de hoy}%
-   \DTMsavedate{FechaEmision}{\the\year-\the\month-\the\day}}%
-  \if at cotizacion
-   \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para cotizacion se recomienda agregar el fondo}}{}%
+ \ifunafirma
+  \setcounter{@Firmas}{1}
+  \ifsinfirmas
+   \sinfirmasfalse
+   \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'unafirma'}
   \fi
-  \if at prefactura
-   \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para prefactura se recomienda agregar el fondo}}{}%
+ \fi
+ \ifsinfirmas\setcounter{@Firmas}{0}\fi
+
+ \ifdcu
+  \@cdufalse\ducfalse
+  \booltrue{DCU}\boolfalse{DUC}
+  \booltrue{PrimeroDescripcion}
+ \fi
+ \ifduc
+  \ifdcu
+   \boolfalse{PrimeroDescripcion}\boolfalse{DCU}\dcufalse\ducfalse\@cdutrue
+   \CLASSWARNING{Las opciones 'duc' y 'dcu' no son compatibles. Sin efecto ambas opciones}
+  \else
+   \ductrue\@cdufalse\dcufalse
+   \booltrue{DUC}\boolfalse{DCU}
+   \booltrue{PrimeroDescripcion}
   \fi
-  \if at sinnumero
-   \if at cotizacion
-   \else
-    \CLASSERROR{La opción para no poner el número sólo es compatible con las cotizaciones}%
-   \fi
+ \fi
+ \ifnumitem\booltrue{NumItem}\fi
+ \ifsincantidad
+  \booltrue{SinCantidad}
+  \ifdcu
+   \dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDescripcion}
+   \CLASSWARNING{La opción 'sincantidad' no es compatible con 'dcu'. Sin efecto opción 'dcu'}
   \fi
-  \if at denom
-   \if at sinnumero
-   \else
-    \ifdefvoid{\@Num}{\CLASSERROR{Hay que definir el número de la factura}}{}%
-   \fi
+  \ifduc
+   \ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDescripcion}
+   \CLASSWARNING{La opción 'sincantidad' no es compatible con 'duc'. Sin efecto opción 'duc'}
   \fi
  \fi
- \ifdefvoid{\@Contacto}{\if at Nombre\else\CLASSWARNING{Pudiera definirse una persona de contacto}\fi}{}%
-}
+ \ifdescuentos\booltrue{Descuentos}\fi
+ \ifiva\impdesctrue\booltrue{IVA}\fi
+ \ifsubtotal
+  \ifdescuentos
+   \booltrue{Subtotal}
+  \else
+   \CLASSWARNING{La opción 'subtotal' no aplica sin descuentos individuales. Sin efecto opción 'subtotal'}
+  \fi
+ \fi
 
+ \ifsinnumero\denomtrue\fi
+ \ifsintotales
+  \iffilas
+   \filasfalse
+   \CLASSWARNING{La opción 'sintotales' no aplica para el modo de totalización en filas. Sin efecto opción 'filas'}
+  \fi
+  \ifcotizacion
+  \else
+   \CLASSWARNING{La opción 'sintotales' no debe usarse en facturas sino en cotizaciones. No es válida una factura sin totales}
+  \fi
+ \fi
+
+ \ifcentrado
+  \iffilas
+  \else
+   \centradofalse
+   \CLASSWARNING{La opción 'centrado' no es compatible con el modo de totalización en columnas. Sin efecto opción 'centrado'}
+  \fi
+ \fi
+ \ifagrupado
+  \iffilas
+   \agrupadofalse
+   \CLASSWARNING{La opción 'agrupado' no es compatible con el modo de totalización en filas. Sin efecto opción 'agrupado'}
+  \fi
+ \fi
+
+ \ifelectro
+  \booltrue{Electro}
+  \gdef\@NotaInterna{\@TextoDescuentoPresidencial}
+  \CLASSWARNING{Ya no está vigente el descuento en la alícuota general. Aplicándolo igual como se pidió}
+  \CLASSINFO{Se estableció el texto aclaratorio del descuento presidencial como 'nota interna'}
+  \iffilas
+   \filasfalse
+   \CLASSWARNING{La opción 'electro' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'}
+  \fi
+ \fi
+
+ \iftodosiva \@BIRtrue \@BIAtrue \@Exentotrue \Gtrue \fi
+ \ifsiniva\AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}\fi
+ \ifsinivaexpresado
+  \iffilas
+   \filasfalse
+   \CLASSWARNING{La opción 'sinivaexpresado' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'}
+  \else
+   \AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}
+  \fi
+ \fi
+
+ \iflinea
+  \RequirePackage{zref-savepos}
+  \ifexpandecuadro
+  \else
+   \CLASSWARNING{La opción 'linea' requiere la opción 'expandecuadro'. Activando la opción 'expandecuadro'}
+  \fi
+ \fi
+ \ifsinmarcas \def\@CaracterCR{\mbox{}} \def\@CaracterCeldasVacias{\mbox{}} \fi
+ \ifnospanish
+ \else
+  \RequirePackage[spanish]{babel}%  Babel en castellano.
+  \RequirePackage[T1]{fontenc}%  Codificación T1 para las tipografías.
+  \IfFileExists{lmodern.sty}{\RequirePackage{lmodern}}{}
+ \fi
+
+ \ifexpandecuadro
+  \ifsinexpandir
+   \expandecuadrofalse
+   \sinexpandirfalse
+   \CLASSWARNING{Las opciones 'expandecuadro' y 'sinexpandir' no son compatibles. Sin efecto ambas opciones}
+  \else
+   \boolfalse{ExpAbajo}
+   \RequirePackage{zref-savepos}[2016/05/21]%  Para guardar la posición en 'Y'.
+  \fi
+ \fi
+ \ifsinexpandir\boolfalse{ExpAbajo}\expandecuadrofalse\fi
+
+ \ifsinreverso\@reversofalse\fi
+ \ifconreporte
+  \@reportetrue
+  \ifsoloreporte
+   \soloreportefalse
+   \CLASSWARNING{La opción 'soloreporte' no es compatible con 'conreporte'. Sin efecto 'soloreporte'}
+  \fi
+ \fi
+ \ifsoloreporte\@reportetrue\@facturafalse\@reversofalse\fi
+
+ \if at reporte
+  \RequirePackage{zref-savepos}% Para la firma, que debe ser cargado aquí siempre que hay reporte porque \FirmaReporte no se ejecuta desde el preámbulo.
+ \fi
+ \ifcsv
+  \if at factura
+   \newwrite\csv \immediate\openout\csv=\jobname.csv
+   \ifsintotales\else\AtEndDocument{\@EscribeTotalesEnCSV}\fi
+  \else
+   \csvfalse
+   \CLASSWARNING{La opción 'csv' require generar la factura. Sin efecto opción 'csv'}
+  \fi
+ \fi
+
+ \iftwoside
+  \@twosidetrue\@mparswitchtrue
+ \else
+  \@twosidefalse\@mparswitchfalse
+ \fi
+
+ % Escribimos en el .log las opciones cargadas:
+ \ifagrupado \CLASSINFO{Opción cargada: agrupado}\fi
+ \ifcentradesc \CLASSINFO{Opción cargada: centradesc}\fi
+ \ifcentrado \CLASSINFO{Opción cargada: centrado}\fi
+ \ifconlineasha \CLASSINFO{Opción cargada: conlineasha}\fi
+ \ifconreporte \CLASSINFO{Opción cargada: conreporte}\fi
+ \ifcotizacion \CLASSINFO{Opción cargada: cotizacion}\fi
+ \ifcsv \CLASSINFO{Opción cargada: csv}\fi
+ \ifdcu \CLASSINFO{Opción cargada: dcu}\fi
+ \ifdenom \CLASSINFO{Opción cargada: denom}\fi
+ \ifdescuentos \CLASSINFO{Opción cargada: descuentos}\fi
+ \ifdosfirmas \CLASSINFO{Opción cargada: dosfirmas}\fi
+ \ifduc \CLASSINFO{Opción cargada: duc}\fi
+ \ifelectro \CLASSINFO{Opción cargada: electro}\fi
+ \ifexpandecuadro \CLASSINFO{Opción cargada: expandecuadro}\fi
+ \iffilas \CLASSINFO{Opción cargada: filas}\fi
+ \ifG \CLASSINFO{Opción cargada: G}\fi
+ \ifimpdesc \CLASSINFO{Opción cargada: impdesc}\fi
+ \ifiva \CLASSINFO{Opción cargada: iva}\fi
+ \iflinea \CLASSINFO{Opción cargada: linea}\fi
+ \ifnospanish \CLASSINFO{Opción cargada: nospanish}\fi
+ \ifnumitem \CLASSINFO{Opción cargada: numitem}\fi
+ \ifprefactura \CLASSINFO{Opción cargada: prefactura}\fi
+ \ifsincantidad \CLASSINFO{Opción cargada: sincantidad}\fi
+ \ifsinexpandir \CLASSINFO{Opción cargada: sinexpandir}\fi
+ \ifsinfirmas \CLASSINFO{Opción cargada: sinfirmas}\fi
+ \ifsiniva \CLASSINFO{Opción cargada: siniva}\fi
+ \ifsinivaexpresado \CLASSINFO{Opción cargada: sinivaexpresado}\fi
+ \ifsinlineash \CLASSINFO{Opción cargada: sinlineash}\fi
+ \ifsinlineashe \CLASSINFO{Opción cargada: sinlineashe}\fi
+ \ifsinlineashi \CLASSINFO{Opción cargada: sinlineashi}\fi
+ \ifsinlineasv \CLASSINFO{Opción cargada: sinlineasv}\fi
+ \ifsinlineasve \CLASSINFO{Opción cargada: sinlineasve}\fi
+ \ifsinlineasvi \CLASSINFO{Opción cargada: sinlineasvi}\fi
+ \ifsinmarcas \CLASSINFO{Opción cargada: sinmarcas}\fi
+ \ifsinnumero \CLASSINFO{Opción cargada: sinnumero}\fi
+ \ifsinreverso \CLASSINFO{Opción cargada: sinreverso}\fi
+ \ifsintotales \CLASSINFO{Opción cargada: sintotales}\fi
+ \ifsoloreporte \CLASSINFO{Opción cargada: soloreporte}\fi
+ \ifsubtotal \CLASSINFO{Opción cargada: subtotal}\fi
+ \iftodosiva \CLASSINFO{Opción cargada: todosiva}\fi
+ \iftwoside \CLASSINFO{Opción cargada: twoside}\fi
+ \ifunafirma \CLASSINFO{Opción cargada: unafirma}\fi
+ \ifvencimiento \CLASSINFO{Opción cargada: vencimiento}\fi
+
+ % Cargamos aquí 'geometry' para que sea después de haber establecido 'twoside'.
+ \RequirePackage{geometry}}
+
 %% Escribimos el total como comentario en el .log, y avisamos cuando la fecha no sea la de hoy.
 \AtEndDocument{%
- \DTMsavenow{Ahora}%
- \DTMsaveddatediff{FechaEmision}{Ahora}{\AuxFecha}%
+ \DTMifsaveddate{FechaEmision}{%
+  \DTMsavenow{Ahora}%
+  \DTMsaveddatediff{FechaEmision}{Ahora}{\AuxFecha}}{}%
  \ifnum\AuxFecha=0%
  \else
   \CLASSWARNING{Fecha del documento \@Fecha\space distinta de la fecha de hoy}%
  \fi
- \if at sintotales
+ \ifsintotales
  \else
   \if at factura\CLASSINFO{\@@Total: \space\space\space \Moneda \Total}\fi
  \fi}
@@ -478,9 +601,12 @@
  \IfBooleanTF{#1}
   {\AtEndPreamble{\DTMsavedate{FechaEmision}{#2-#3-#4}}}
   {\AtEndPreamble{\DTMsavedatex{FechaEmision}{#2}}}}
+\def\@Fecha{\DTMusedate{FechaEmision}}
+
 \NewDocumentCommand{\FormatoFecha}{o g g}{%
  \IfValueT{#1}{\gdef\@FormatoFechaEntrada{#1}}\IfValueT{#2}{\gdef\@FormatoFecha{#2}}\IfValueT{#3}{\gdef\@FechaSeparadores{#3}}}
-\def\Credito#1{\gdef\@Credito{#1}\@vencimientotrue}
+
+\def\Credito#1{\gdef\@Credito{#1}\vencimientotrue}
 \def\RazonSocial#1{\gdef\@RazonSocial{#1}}
 \def\Nombre#1{\gdef\@RazonSocial{#1}\@Nombretrue}
 \def\RIF#1{\gdef\@RIF{#1}}
@@ -543,6 +669,47 @@
 \NewDocumentCommand{\NotaExterna}{+m}{\gdef\@NotaExterna{#1}}
 
 \AtBeginDocument{%
+ % Efectuamos distintos chequeos.
+ \if at reporte
+  \ifdefvoid{\@Num}{\CLASSWARNING{No se especificó el número de la factura. Puede dar error si el título del reporte no se especifica que aparezca en las cabeceras}}{}%
+  \ifdefvoid{\@Proveedor}{%
+   \ifdefvoid{\@Emisor}
+    {\CLASSERROR{Hay que definir el nombre del proveedor cuando se emite un reporte}}%
+    {\CLASSWARNING{Se toma el emisor como el proveedor por no haberse especificado este último}%
+    \let\@Proveedor=\@Emisor}}
+   {}%
+ \fi
+ \ifdefvoid{\@RazonSocial}{\CLASSERROR{Hay que definir la razón social}}{}%
+ \if at factura
+  \ifdefvoid{\@RIF}{\CLASSERROR{Hay que definir el R.I.F}}{}%
+  \ifdefvoid{\@Direccion}{\CLASSERROR{Hay que definir la dirección fiscal}}{}%
+  \ifdefvoid{\@Telefono}{\CLASSWARNING{Pudiera definirse un número telefónico}}{}%
+  \ifdefvoid{\@Email}{\CLASSWARNING{Pudiera definirse una dirección de correo electrónico}}{}%
+  \ifdefvoid{\@Condiciones}{\CLASSWARNING{Pudieran definirse las condiciones del documento}}{}%
+  \DTMifsaveddate{FechaEmision}{}{%
+   \CLASSWARNING{No se especificó fecha. Asumiendo la fecha de hoy}%
+   \DTMsavedate{FechaEmision}{\the\year-\the\month-\the\day}}%
+  \ifcotizacion
+   \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para cotizacion se recomienda agregar el fondo}}{}%
+  \fi
+  \ifprefactura
+   \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para prefactura se recomienda agregar el fondo}}{}%
+  \fi
+  \ifsinnumero
+   \ifcotizacion
+   \else
+    \CLASSERROR{La opción para no poner el número sólo es compatible con las cotizaciones}%
+   \fi
+  \fi
+  \ifdenom
+   \ifsinnumero
+   \else
+    \ifdefvoid{\@Num}{\CLASSERROR{Hay que definir el número de la factura}}{}%
+   \fi
+  \fi
+ \fi
+ \ifdefvoid{\@Contacto}{\if at Nombre\else\CLASSWARNING{Pudiera definirse una persona de contacto}\fi}{}%
+
  % El cálculo de la fecha de vencimiento para cuando haya crédito o fecha de vencimiento explícita.
  \ifdefvoid{\@Credito}
   {\gdef\@FechaVencimiento{\DTMusedate{FechaEmision}}}
@@ -563,8 +730,33 @@
  \FPupn\@DescuentoGfactor{100 \@DescuentoGporc{} /}%
  \FPupn\@DescuentoRfactor{100 \@DescuentoRporc{} /}%
  \FPupn\@DescuentoAfactor{100 \@DescuentoAporc{} /}%
- \FPupn\@DescuentoEfactor{100 \@DescuentoEporc{} /}}
+ \FPupn\@DescuentoEfactor{100 \@DescuentoEporc{} /}
 
+ % Una vez definido todo en el preámbulo, los comandos usados para definir campos servirán para mostrar el campo que se definió con ese comando.
+ \def\RazonSocial{\@RazonSocial}%
+ \let\Nombre\RazonSocial
+ \def\RIF{\@RIF}%
+ \let\CI\RIF
+ \def\Direccion{\@Direccion}%
+ \def\Telefono{\@Telefono}%
+ \def\Email{\@Email}%
+ \def\Contacto{\@Contacto}%
+ \def\Emisor{\@Emisor}%
+ \def\Conforme{\@Conforme}%
+ \def\Proveedor{\@Proveedor}%
+ \def\Fecha{\@Fecha}%
+ \def\FechaVencimiento{\@FechaVencimiento}%
+ \def\Credito{\@Credito}%
+ \def\Num{\@Num}%
+ \def\NumSerieControl{\@NumSerieControl}%
+ \def\NumControl{\@NumControl}%
+ \def\Condiciones{\@Condiciones}%
+ \def\Resumen{\@Resumen}%
+ \def\NotaPrevia{\@NotaPrevia}%
+ \def\NotaInterna{\@NotaInterna}%
+ \def\NotaExterna{\@NotaExterna}%
+ \def\TituloReporte{\@TituloReporte}}
+
 %% Posiciones (X,Y) de los objetos: i) fecha, ii) denominación, iii) condiciones, iv) número de control, v) firmas.
 \NewDocumentCommand{\PosFecha}{s m m}{
  \IfBooleanTF{#1}{\booltrue{FechaYarriba}}{\boolfalse{FechaYarriba}}
@@ -743,17 +935,18 @@
 
 %% Comando para incluir la firma escaneada en el sitio donde va la línea de la firma del emisor.
 \NewDocumentCommand{\FirmaFactura}{m O{0pt} O{0pt}}{% \FirmaFactura{imagen}[x-corr][y-corr]
- \if at factura
-  \RequirePackage{graphicx}
-  \ifx&#2&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi
-  \ifx&#3&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi
-  \savebox{\@CajaFirmaEmisor}{#1}
-  \AtBeginShipoutNext{%
-   \begin{textblock*}{\@TamLineaFirmas}%
-    (\textwidth+\oddsidemargin+1in-\@TamLineaFirmas/2-\wd\@CajaFirmaEmisor/2-\@PosFirmasXdos+\@FirmaFacturaXcorr,\@PosFirmasY-\ht\@CajaFirmaEmisor-\dp\@CajaFirmaEmisor+\@FirmaFacturaYcorr)%
-    \usebox{\@CajaFirmaEmisor}%
-   \end{textblock*}}%
- \fi}
+ \AtEndPreamble{
+  \if at factura
+   \RequirePackage{graphicx}
+   \ifx&#2&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi
+   \ifx&#3&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi
+   \savebox{\@CajaFirmaEmisor}{#1}
+   \AtBeginShipoutNext{%
+    \begin{textblock*}{\@TamLineaFirmas}%
+     (\textwidth+\oddsidemargin+1in-\@TamLineaFirmas/2-\wd\@CajaFirmaEmisor/2-\@PosFirmasXdos+\@FirmaFacturaXcorr,\@PosFirmasY-\ht\@CajaFirmaEmisor-\dp\@CajaFirmaEmisor+\@FirmaFacturaYcorr)%
+     \usebox{\@CajaFirmaEmisor}%
+    \end{textblock*}}%
+  \fi}}
 
 \NewDocumentCommand{\FirmaReporte}{O{} O{0pt} O{0pt} G{\@Proveedor} O{\@FirmaReportePosX} O{\@FirmaReporteExcesoLinea}}{% \Firma[imagen][x-corr][y-corr]{texto}[posición en X desde la derecha][tamaño linea]
  \renewcommand{\baselinestretch}{1}\selectfont
@@ -802,20 +995,22 @@
 
 %% Con \FondoFactura le damos el nombre del archivo que contiene el formato de la factura, por ejemplo para compilaciones con 'prefactura', 'cotizacion' o para incluir una imagen de fondo como 'marca de agua'.
 \newcommand{\FondoFactura}[1]{
- \if at factura
-  \RequirePackage{graphicx}
-  \@FondoFacturatrue
-  \gdef\@FondoFactura{#1}
- \fi}
+ \AtEndPreamble{
+  \if at factura
+   \RequirePackage{graphicx}
+   \@FondoFacturatrue
+   \gdef\@FondoFactura{#1}
+  \fi}}
 
 %% Con \FondoReporte le damos el nombre del archivo que contiene el formato del reporte. Existen dos posibilidades: que dicho fondo salga en todas las páginas o sólo en la primera.
 \NewDocumentCommand{\FondoReporte}{s m}{
- \if at reporte
-  \@FondoReportetrue
-  \RequirePackage{graphicx}
-  \gdef\@FondoReporte{#2}
-  \IfBooleanT{#1}{\@FondoReporteStartrue}% Con * sale en todas las páginas; sin * sale sólo en la primera página.
- \fi}
+ \AtEndPreamble{
+  \if at reporte
+   \@FondoReportetrue
+   \RequirePackage{graphicx}
+   \gdef\@FondoReporte{#2}
+   \IfBooleanT{#1}{\@FondoReporteStartrue}% Con * sale en todas las páginas; sin * sale sólo en la primera página.
+  \fi}}
 
 %% Comando para establecer desde el preámbulo el estilo de página (\pagestyle) del reporte, tanto para la primera página como para las siguientes.
 \NewDocumentCommand{\EstiloPagReporte}{o m}{
@@ -837,43 +1032,11 @@
 
 \input{factura.def}%  Cargamos los valores predeterminados.
 
-\if at todosiva
- \@BIRtrue
- \@BIAtrue
- \@Exentotrue
- \@Gtrue
-\fi
-
-\if at csv%  Abre el archivo csv.
- \newwrite\csv
- \immediate\openout\csv=\jobname.csv
-\fi
-
-\if at nospanish
-\else
- \RequirePackage[spanish]{babel}%  Babel en castellano.
- \RequirePackage[T1]{fontenc}%  Codificación T1 para las tipografías.
- \IfFileExists{lmodern.sty}{\RequirePackage{lmodern}}{}
-\fi
-
-\if at expandecuadro
- \RequirePackage{zref-savepos}[2016/05/21]%  Para guardar la posición en 'Y'.
-\fi
-
-\if at reporte
- \RequirePackage{zref-savepos}%  Para la firma, que debe ser cargado aquí porque \FirmaReporte no se ejecuta desde el preámbulo.
-\fi
-
-\if at sinmarcas
- \def\@CaracterCR{\mbox{}}
- \def\@CaracterCeldasVacias{\mbox{}}
-\fi
-
 %% Comando para escribir el encabezado en la factura.
 \newcommand\@EncabezadoFactura{%
  \ifdefvoid{\@Resumen}{\@EscribeDatos}{\@EscribeDatosResumen}%
  \vspace*{\@SeparaVertical}%
- \if at expandecuadro\else\vfill\fi}
+ \ifexpandecuadro\else\vfill\fi}
 
 %% Comando para escribir el encabezado en el reporte.
 \newcommand\@EncabezadoReporte{%
@@ -910,11 +1073,11 @@
 %% http://tex.stackexchange.com/questions/296035/insert-a-special-character-at-each-end-of-line-in-a-paragraph
 %% http://tex.stackexchange.com/questions/248944/how-to-put-before-lines
 \newcommand{\@DescripcionAuxCmd}[2]{%
- \if at impdesc\settowidth{\@TempDimen}{\@EscribeTipoDeImpuesto{#2}}\fi
+ \ifimpdesc\settowidth{\@TempDimen}{\@EscribeTipoDeImpuesto{#2}}\fi
  \savebox{\@CajaPrueba}{%
   \parbox[t]{\linewidth}{%
    \David at XStart
-   \if at centradesc\centering\arraybackslash\fi
+   \ifcentradesc\centering\arraybackslash\fi
    #1%
    \David at XEnd
    \ifdim\@TempDimen=0pt%
@@ -922,7 +1085,7 @@
     \hfill\kern\@SeparaFinLineaDesc\@EscribeTipoDeImpuesto{#2}%
    \fi
    \par\global\count1=\prevgraf}}%
- \if at sinmarcas
+ \ifsinmarcas
   \usebox{\@CajaPrueba}%
  \else
   \ifnum\count1=1%
@@ -934,7 +1097,7 @@
    \fi
    \parbox[t]{\linewidth-\@TempDimen-\@SeparaFinLineaDesc}{%
     \David at XStart
-    \if at centradesc\centering\arraybackslash\fi
+    \ifcentradesc\centering\arraybackslash\fi
     #1%
     \David at XEnd
     \par
@@ -943,7 +1106,7 @@
     \count2=\prevgraf
     \loop
      \ifnum\count0=\count2
-      \if at impdesc
+      \ifimpdesc
        \vskip-\baselineskip
        \mbox{}\hfill
        \rlap{%
@@ -1007,11 +1170,11 @@
 %% Presentación de totales en modo de columnas.
 \newcommand{\@EscribeTotalCol}[1]{%
  \expandafter\FPifeq\csname Desc#1\endcsname{0}%
-  \if at sinivaexpresado\else\@EscribeTotalColBI{#1}\fi
+  \ifsinivaexpresado\else\@EscribeTotalColBI{#1}\fi
  \else
   \@EscribeTotalColSubt{#1}%
   \@EscribeTotalColDesc{#1}%
-  \if at sinivaexpresado\else\@EscribeTotalColBI{#1}\fi
+  \ifsinivaexpresado\else\@EscribeTotalColBI{#1}\fi
  \fi}
 
 %% Forma agupada para la presentación de totales en modo de columnas.
@@ -1024,7 +1187,7 @@
  \if at BIR\if at DescR\@EscribeTotalColDesc{R}\fi\fi
  \if at DescG\@EscribeTotalColDesc{G}\fi
  \if at BIA\if at DescA\@EscribeTotalColDesc{A}\fi\fi
- \if at sinivaexpresado
+ \ifsinivaexpresado
  \else
   \if at Exento\@EscribeTotalColBI{E}\fi
   \if at BIR\@EscribeTotalColBI{R}\fi
@@ -1040,7 +1203,7 @@
  \@LetraTitTotales \csname @@BI#1\endcsname
   \ifx#1E%
   \else
-   \if at G\ \hfill(\csname @Alicuota#1porc\endcsname\%)\else\mbox{}\fi
+   \ifG\ \hfill(\csname @Alicuota#1porc\endcsname\%)\else\mbox{}\fi
   \fi
  & \@LetraNumTotales\numprint{\csname BI#1\endcsname} \\}
 
@@ -1083,7 +1246,7 @@
 \newcommand{\@EscribeTotalFilasBIizq}[1]{%
  \@LetraTitTotales\csname @@BI#1\endcsname
  \ifx#1G%
-  \if at G \ (\@AlicuotaGporc\%)\fi%  Si hay otra B.I. que no sea general, escribimos el porcentaje explícito en la general.
+  \ifG \ (\@AlicuotaGporc\%)\fi%  Si hay otra B.I. que no sea general, escribimos el porcentaje explícito en la general.
  \else
   \ifx#1E%
   \else
@@ -1152,7 +1315,7 @@
  \hspace*{\@SepTotales}\usebox{\@CajaAliG}%
  \if at Exento\hspace*{\@SepTotales}\usebox{\@CajaBIE}\fi
  \hspace*{\@SepTotales}\usebox{\@CajaTotal}%
- \if at centrado\hspace*{\@SepTotales}\fi}
+ \ifcentrado\hspace*{\@SepTotales}\fi}
 
 \newcommand{\@EscribeTotalesFilasGxET}{%
  \if at BIR\hspace*{\@SepTotales}\usebox{\@CajaBIAliR}\fi
@@ -1159,7 +1322,7 @@
  \hspace*{\@SepTotales}\usebox{\@CajaBIAliG}%
  \if at BIA\hspace*{\@SepTotales}\usebox{\@CajaBIAliA}\fi
  \hspace*{\@SepTotales}\if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
- \if at centrado\hspace*{\@SepTotales}\fi}
+ \ifcentrado\hspace*{\@SepTotales}\fi}
 
 \newcommand{\@EscribeTotalesFilasRGA}{%
  \hspace*{\@SepTotales}\usebox{\@CajaBIAliR}%
@@ -1170,12 +1333,12 @@
 \newcommand{\@EscribeTotalesFilasRGAET}{%
  \@EscribeTotalesFilasRGA
  \if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
- \if at centrado\hspace*{\@SepTotales}\fi}
+ \ifcentrado\hspace*{\@SepTotales}\fi}
 
 %% Escribe la letra que designa al tipo de impuesto que aplica al ítem.
 \NewDocumentCommand{\@EscribeTipoDeImpuesto}{m}{%
  % Hay que abrir un grupo de ejecución porque el cambio en la tipografía altera la celda.
- {\if at G
+ {\ifG
    \@LetraTipoIVA
    \ifx#1G\@DenomAlicuotaG\fi
    \ifx#1R\@DenomAlicuotaR\fi
@@ -1278,23 +1441,6 @@
  % Novena y última línea.
  \ifbool{SinLineasVertExt}{}{|}}
 
-%% Comando auxiliar para abrir la tabla del cuadro de la factura y expandir completamente las columnas.
-\edef\@FacturaAuxInicioCmd{\noexpand\begin{tabularx}{\textwidth}{\@FacturaAuxColumnasEval}}
-
-%% Comando auxiliar para abrir el '\multicolumn' para los totales en el modo de columnas y expandir completamente las columnas cuando hay o no barras verticales.
-\edef\@ColumnasMultiColumnTotalesAuxCmd{%
- \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|} r}\begingroup
-   \noexpand\ifdim \noexpand\ht\noexpand\@CajaEspacioVacio=0pt
-   \noexpand\else
-    \noexpand\if at linea\noexpand\zsaveposx{LineaNodoBCoordX}\noexpand\zsaveposy{LineaNodoBCoordY}\noexpand\fi\noexpand\fi% Fijamos la posición (x,y) final para la línea ya que estaremos justo en el punto donde escribimos el total, y hasta allí llega la línea en el modo de columnas.
-    \noexpand\begin{tabular}[b]{@{\noexpand\extracolsep{2\noexpand\tabcolsep}}lr \ifbool{SinLineasVertExt}{}{|}}}
-
-%% Comando auxiliar para abrir el '\multicolumn' de la nota interna y evalúe la presencia o no de las barras verticales.
-\edef\@ColumnasMultiColumnNotaIntAuxCmd{%
- \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|}l\ifbool{SinLineasVertExt}{}{|}}{%
-  \noexpand\parbox[t]{\linewidth-2\tabcolsep-2\arrayrulewidth}{\noexpand\@LetraNotaInterna\noexpand\@NotaInterna\noexpand\strut}}%
-  \noexpand\\}
-
 %% Comando para hacer los cálculos sobre cada ítem y establecer las macros con el contenido de cada ítem introducido.
 \NewDocumentCommand{\@CalculaItem}{m m m o m m}{%
  \addtocounter{NumItem}{1}%
@@ -1303,7 +1449,7 @@
  \ifbool{Descuentos}
   {\ifx\\#6\\\FPset\Dcto{0}\else\FPupn\Dcto{#6 \@DigitosPorc{} round clip}\fi}% Fijamos en 0 el descuento si no se especifica en \Item***.
   {\FPset\Dcto{#6}%
-   \FPifeq\Dcto{0}\else\CLASSWARNING{Se pidió un descuento individual sin dar la opción de la clase 'descuentos'. No se tomará en cuenta.}\fi
+   \FPifeq\Dcto{0}\else\CLASSWARNING{Se pidió un descuento individual sin dar la opción de la clase 'descuentos'. No se tomará en cuenta}\fi
    \FPset\Dcto{0}}% También fijamos en 0 el descuento por si se especifica en \Item*** pero no se pide la opción 'descuentos'.
  \FPupn\PrecioS{#2 \PrecioU{} * \@DigitosMoneda{} round}%
  \FPupn\PrecioT{100 \Dcto{} 100 - / \PrecioS{} * \@DigitosMoneda{} round}%
@@ -1359,502 +1505,519 @@
   \fi
  \fi}
 
-%% Comando auxiliar para la definición del ambiente de la factura; al final de este comando está el texto que va en el enddef del ambiente de la factura.
-\newcommand{\@FacturaAuxCmd}[1]{%
- \if at expandecuadro
-  \setlength{\@EspacioVacioInicial}{\zposy{EspacioVacioInicial}sp}%
-  \setlength{\@EspacioVacioFinal}{\zposy{EspacioVacioFinal}sp}%
-  \global\@EspacioVacioInicial=\@EspacioVacioInicial% Hay que globalizarlas
-  \global\@EspacioVacioFinal=\@EspacioVacioFinal
-  \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{0pt}{%
-   \if at linea
-    \if at LineaCompleta
-     \zsaveposy{LineaNodoBCoordY}%
-    \else
-     \if at LineaHastaTotal
+%% Todo esto tiene que estar dentro de \AtEndPreamble que es cuando \if at factura, \if at reverso e \if at reporte fueron ya aplicadas, y para que se evalúen adecuadamente en su momento las definiciones hechas con \edef.
+\AtEndPreamble{
+ % Comando auxiliar para abrir la tabla del cuadro de la factura y expandir completamente las columnas.
+ \edef\@FacturaAuxInicioCmd{\noexpand\begin{tabularx}{\textwidth}{\@FacturaAuxColumnasEval}}
+
+ % Comando auxiliar para abrir el '\multicolumn' de la nota interna y evalúe la presencia o no de las barras verticales.
+ \edef\@ColumnasMultiColumnNotaIntAuxCmd{%
+  \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|}l\ifbool{SinLineasVertExt}{}{|}}{%
+   \noexpand\parbox[t]{\linewidth-2\tabcolsep-2\arrayrulewidth}{\noexpand\@LetraNotaInterna\noexpand\@NotaInterna\noexpand\strut}}%
+   \noexpand\\}
+
+ % Comando auxiliar para abrir el '\multicolumn' para los totales en el modo de columnas y expandir completamente las columnas cuando hay o no barras verticales.
+ \edef\@ColumnasMultiColumnTotalesAuxCmd{%
+  \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|} r}\begingroup
+    \noexpand\ifdim \noexpand\ht\noexpand\@CajaEspacioVacio=0pt
+    \noexpand\else
+     \noexpand\iflinea\noexpand\zsaveposx{LineaNodoBCoordX}\noexpand\zsaveposy{LineaNodoBCoordY}\noexpand\fi\noexpand\fi% Fijamos la posición (x,y) final para la línea ya que estaremos justo en el punto donde escribimos el total, y hasta allí llega la línea en el modo de columnas.
+     \noexpand\begin{tabular}[b]{@{\noexpand\extracolsep{2\noexpand\tabcolsep}}lr \ifbool{SinLineasVertExt}{}{|}}}
+
+ % Comando auxiliar para la definición del ambiente de la factura; al final de este comando está el texto que va en el enddef del ambiente de la factura.
+ \newcommand{\@FacturaAuxCmd}[1]{%
+  \ifexpandecuadro
+   \setlength{\@EspacioVacioInicial}{\zposy{EspacioVacioInicial}sp}%
+   \setlength{\@EspacioVacioFinal}{\zposy{EspacioVacioFinal}sp}%
+   \global\@EspacioVacioInicial=\@EspacioVacioInicial% Hay que globalizarlas
+   \global\@EspacioVacioFinal=\@EspacioVacioFinal
+   \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{0pt}{%
+    \iflinea
+     \if at LineaCompleta
+      \zsaveposy{LineaNodoBCoordY}%
      \else
-      \zsaveposx{LineaNodoACoordX}\mbox{}\hfill \zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}%
+      \if at LineaHastaTotal
+      \else
+       \zsaveposx{LineaNodoACoordX}\mbox{}\hfill \zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}%
+      \fi
      \fi
+    \fi}}%
+   \ifdim \ht\@CajaEspacioVacio=0pt \global\lineafalse \fi
+  \fi
+
+  \ifx\undefined\Total\relax\else\CLASSERROR{Parece ya haberse usado un entorno de factura}\fi
+  %
+  % Comandos \David at SavePos, \David at XStart, \David at XEnd, \David at XPad, \David at XLeft y \David at XRight para poder manejar el salto de línea en las columnas adyacentes a la columna 'X' del tabularx (la descripción), cuando esta ocupa más que una línea.
+  % Gracias a David Carlisle (Thanks to David Carlisle).
+  % http://tex.stackexchange.com/questions/111203/tabularx-bottom-alignment-on-r-or-l-columns-when-x-column-wraps
+  \def\David at SavePos##1{\leavevmode\pdfsavepos\write\@auxout{\gdef\noexpand##1{\the\pdflastypos sp}}}%
+  \def\David at XStart{\expandafter\David at SavePos\csname save at start@\romannumeral\value{NumItem}\endcsname}%
+  \def\David at XEnd{\expandafter\David at SavePos\csname save at end@\romannumeral\value{NumItem}\endcsname}%
+  \def\David at XPad##1##2##3{%
+   \vtop{%
+    \baselineskip\normalbaselineskip
+    ##2%
+    \expandafter
+    \ifx\csname save at start@##1\endcsname
+     \relax
+    \else
+     \dimen@\csname save at start@##1\endcsname\relax
+     \loop
+      \ifdim\dimen@>\csname save at end@##1\endcsname
+      \advance\dimen at -\baselineskip
+      \settowidth{\@TempDimen}{##3}%
+       \ifdim\@TempDimen=0pt\settowidth{\@TempDimen}{##2}\fi
+      \hbox{\parbox{\@TempDimen}{\@CaracterCeldasVacias}}%
+     \repeat
     \fi
-   \fi}}%
-  \ifdim \ht\@CajaEspacioVacio=0pt \global\@lineafalse \fi
- \fi
-
- \ifx\undefined\Total\relax\else\CLASSERROR{Parece ya haberse usado un entorno de factura}\fi
- %
- % Comandos \David at SavePos, \David at XStart, \David at XEnd, \David at XPad, \David at XLeft y \David at XRight para poder manejar el salto de línea en las columnas adyacentes a la columna 'X' del tabularx (la descripción), cuando esta ocupa más que una línea.
- % Gracias a David Carlisle (Thanks to David Carlisle).
- % http://tex.stackexchange.com/questions/111203/tabularx-bottom-alignment-on-r-or-l-columns-when-x-column-wraps
- \def\David at SavePos##1{\leavevmode\pdfsavepos\write\@auxout{\gdef\noexpand##1{\the\pdflastypos sp}}}%
- \def\David at XStart{\expandafter\David at SavePos\csname save at start@\romannumeral\value{NumItem}\endcsname}%
- \def\David at XEnd{\expandafter\David at SavePos\csname save at end@\romannumeral\value{NumItem}\endcsname}%
- \def\David at XPad##1##2##3{%
-  \vtop{%
-   \baselineskip\normalbaselineskip
-   ##2%
-   \expandafter
-   \ifx\csname save at start@##1\endcsname
-    \relax
+    ##3}}%
+  \def\David at XLeft##1{\David at XPad{\romannumeral\value{NumItem}}{\hbox{##1}}{}}%
+  \def\David at XRight##1{\David at XPad{\romannumeral\value{NumItem}}{}{\hbox{##1}}}%
+  %
+  % Caja auxiliar para el caracter de retorno de carro y poder saber si tamaño en el campo de la descripción.
+  \savebox{\@CajaCaracterCR}{\@LetraItems\@CaracterCR}
+  %
+  % Comando para fijar la separación extra final de cada item, lo cual viene dado por la cantidad de líneas de la descripción,
+  % que está alojado en \count1, definido en \@DescripcionAuxCmd.
+  \def\@CalculaSeparaItemsExtraFinal{%
+   \setlength{\@SeparaItemsExtraFinal}{\numexpr\the\count1\normalbaselineskip-\normalbaselineskip+\@SeparaItemsExtra}%
+   \global\@SeparaItemsExtraFinal=\@SeparaItemsExtraFinal}
+  %
+  % Comando interno general para agregar cualquier ítem.
+  \NewDocumentCommand{\@ITEM}{m m m o m m}{%
+   % 1. [R|G|A|E|X]; 2. cantidad; 3. descripción; 4. descripción para el csv (entre corchetes); 5. p/u; 6. dcto.
+   \@CalculaItem{##1}{##2}{##3}{##5}{##6}%
+   % Si no es el primer ítem, entonces hace falta \\ para terminar el ítem anterior.
+   \ifnum\value{NumItem}=1% Aquí, \@CalculaItem aumenta en 1 el contador NumItem, que si vale 1 significa que aún no hemos procesado la línea 1, es decir, no hay que hacer el salto de línea. La última línea se termina en otro lado.
    \else
-    \dimen@\csname save at start@##1\endcsname\relax
-    \loop
-     \ifdim\dimen@>\csname save at end@##1\endcsname
-     \advance\dimen at -\baselineskip
-     \settowidth{\@TempDimen}{##3}%
-      \ifdim\@TempDimen=0pt\settowidth{\@TempDimen}{##2}\fi
-     \hbox{\parbox{\@TempDimen}{\@CaracterCeldasVacias}}%
-    \repeat
+    \@CalculaSeparaItemsExtraFinal
+    \\[\@SeparaItemsExtraFinal]
+    \ifconlineasha\hline\fi% Líneas para separar cada ítem, si hiciera falta.
    \fi
-   ##3}}%
- \def\David at XLeft##1{\David at XPad{\romannumeral\value{NumItem}}{\hbox{##1}}{}}%
- \def\David at XRight##1{\David at XPad{\romannumeral\value{NumItem}}{}{\hbox{##1}}}%
- %
- % Caja auxiliar para el caracter de retorno de carro y poder saber si tamaño en el campo de la descripción.
- \savebox{\@CajaCaracterCR}{\@LetraItems\@CaracterCR}
- %
- % Comando para fijar la separación extra final de cada item, lo cual viene dado por la cantidad de líneas de la descripción,
- % que está alojado en \count1, definido en \@DescripcionAuxCmd.
- \def\@CalculaSeparaItemsExtraFinal{%
-  \setlength{\@SeparaItemsExtraFinal}{\numexpr\the\count1\normalbaselineskip-\normalbaselineskip+\@SeparaItemsExtra}%
-  \global\@SeparaItemsExtraFinal=\@SeparaItemsExtraFinal}
- %
- % Comando interno general para agregar cualquier ítem.
- \NewDocumentCommand{\@ITEM}{m m m o m m}{%
-  % 1. [R|G|A|E|X]; 2. cantidad; 3. descripción; 4. descripción para el csv (entre corchetes); 5. p/u; 6. dcto.
-  \@CalculaItem{##1}{##2}{##3}{##5}{##6}%
-  % Si no es el primer ítem, entonces hace falta \\ para terminar el ítem anterior.
-  \ifnum\value{NumItem}=1% Aquí, \@CalculaItem aumenta en 1 el contador NumItem, que si vale 1 significa que aún no hemos procesado la línea 1, es decir, no hay que hacer el salto de línea. La última línea se termina en otro lado.
-  \else
-   \@CalculaSeparaItemsExtraFinal
-   \\[\@SeparaItemsExtraFinal]
-   \if at conlineasha\hline\fi% Líneas para separar cada ítem, si hiciera falta.
-  \fi
-  % Primer -opcional- campo: El número del ítem.
-  \ifbool{NumItem}{\David at XLeft{\@NumItemAuxCmd{\mbox{}\hfill \@LetraNumeros \arabic{NumItem}\hfill\mbox{}}}}{}%
-  &
-  % Segundo campo: Acá puede ir la cantidad (cdu) o la descripción (dcu y duc).
-  \ifbool{SinCantidad}{}{%
-   \ifbool{PrimeroDescripcion}
-   {\@DescripcionAuxCmd{##3}{##1}}% dcu y duc.
-   {\David at XLeft{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}}}% cdu.
-  &
-  % Tercer campo: Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc).
-  \ifbool{PrimeroDescripcion}{%
-   \if at dcu
-    \David at XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu.
-   \else
-    \David at XRight{\@PrecioUAuxCmd{%
+   % Primer -opcional- campo: El número del ítem.
+   \ifbool{NumItem}{\David at XLeft{\@NumItemAuxCmd{\mbox{}\hfill \@LetraNumeros \arabic{NumItem}\hfill\mbox{}}}}{}%
+   &
+   % Segundo campo: Acá puede ir la cantidad (cdu) o la descripción (dcu y duc).
+   \ifbool{SinCantidad}{}{%
+    \ifbool{PrimeroDescripcion}
+    {\@DescripcionAuxCmd{##3}{##1}}% dcu y duc.
+    {\David at XLeft{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}}}% cdu.
+   &
+   % Tercer campo: Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc).
+   \ifbool{PrimeroDescripcion}{%
+    \ifdcu
+     \David at XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu.
+    \else
+     \David at XRight{\@PrecioUAuxCmd{%
+      \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
+      \else
+       \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU}
+      \fi}}% duc.
+    \fi}
+   {\@DescripcionAuxCmd{##3}{##1}}% cdu.
+   &
+   % Cuarto campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc).
+   \FPifeq\PrecioU{##5}\else\CLASSWARNING{Se está introduciendo un precio con más de dos decimales: (##3 - ##5. Redondeado a \PrecioU)}{}\fi% Advertimos cuando el precio unitario tiene más de dos decimales.
+   \ifbool{SinCantidad}{}{%
+    \ifduc
+     \David at XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% duc.
+    \else
+     \David at XRight{\@PrecioUAuxCmd{%
+      \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
+      \else
+       \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU}
+      \fi}}% dcu y cdu.
+    \fi}%
+   & % Quinto -opcional- campo: Subtotal (para luego descuentos).
+   \ifbool{Subtotal}{%
+    \David at XRight{\@PrecioSAuxCmd{%
      \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
      \else
-      \if at impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU}
-     \fi}}% duc.
-   \fi}
-  {\@DescripcionAuxCmd{##3}{##1}}% cdu.
-  &
-  % Cuarto campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc).
-  \FPifeq\PrecioU{##5}\else\CLASSWARNING{Se está introduciendo un precio con más de dos decimales: (##3 - ##5. Redondeado a \PrecioU)}{}\fi% Advertimos cuando el precio unitario tiene más de dos decimales.
-  \ifbool{SinCantidad}{}{%
-   \if at duc
-    \David at XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% duc.
-   \else
-    \David at XRight{\@PrecioUAuxCmd{%
+      \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioS}
+     \fi}}}{}
+   &
+   % Sexto -opcional- campo: Descuento.
+   \ifbool{Descuentos}{%
+    \David at XRight{\@DescuentoAuxCmd{%
      \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
      \else
-      \if at impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU}
-     \fi}}% dcu y cdu.
-   \fi}%
-  & % Quinto -opcional- campo: Subtotal (para luego descuentos).
-  \ifbool{Subtotal}{%
-   \David at XRight{\@PrecioSAuxCmd{%
+      \mbox{}\hfill \@LetraNumeros \numprint{\Dcto}\%\hfill\mbox{}%
+     \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq.
+   &
+   % Séptimo -opcional- campo: IVA.
+   \ifbool{IVA}{%
+    \David at XRight{\@IVAAuxCmd{%
+     \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
+     \else
+      \mbox{}\hfill \@LetraNumeros \numprint{\csname @Alicuota##1porc\endcsname}\%\hfill\mbox{}%
+     \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq.
+   &
+   % Octavo campo: El total.
+   \David at XRight{\@PrecioTAuxCmd{%
     \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
     \else
-     \if at impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioS}
-    \fi}}}{}
-  &
-  % Sexto -opcional- campo: Descuento.
-  \ifbool{Descuentos}{%
-   \David at XRight{\@DescuentoAuxCmd{%
-    \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
+     \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioT}
+    \fi}}%
+   % Escribimos al csv.
+   \ifcsv
+    \IfValueTF{##4}{\@EscribeItemsEnCSV{##1}{##2}{##4}}{\@EscribeItemsEnCSV{##1}{##2}{##3}}%
+   \fi}%
+  %
+  % Comando para escribir en el .csv.
+  \newcommand{\@EscribeItemsEnCSV}[3]{%
+   \ifbool{SinCantidad}
+   {\ifdescuentos
+     \immediate\write\csv{"\unexpanded{##3}","\Dcto","\PrecioT","##1"}%
     \else
-     \mbox{}\hfill \@LetraNumeros \numprint{\Dcto}\%\hfill\mbox{}%
-    \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq.
+     \immediate\write\csv{"\unexpanded{##3}","\PrecioT","##1"}%
+    \fi}
+   {\if at cdu
+     \ifdescuentos
+      \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\Dcto","\PrecioT","##1"}%
+     \else
+      \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\PrecioT","##1"}%
+     \fi
+    \fi
+    \ifdcu
+     \ifdescuentos
+      \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\Dcto","\PrecioT","##1"}%
+     \else
+      \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\PrecioT","##1"}%
+     \fi
+    \fi
+    \ifduc
+     \ifdescuentos
+      \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\Dcto","\PrecioT","##1"}%
+     \else
+      \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\PrecioT","##1"}%
+     \fi
+    \fi}}%
+  %
+  % Usamos la definición de \label at factura dentro del entorno de la factura para que sea local aquí nada más.
+  \let\label\label at factura
+  \@LetraItems% Este es el tipo de letra que tendrán los ítems, y en este tipo de letra se define el \baselineskip de toda la factura.
+  \@FacturaAuxInicioCmd
+  \ifbool{SinLineasHoriExt}{}{\hline}%
+  \@ZERO
+  % Estamos en el número del ítem, si aplicara.
+  \if at LineaDesdeInicio \hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}\fi
+  \ifbool{NumItem}{\@NumItemAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@NumItem \hfill\mbox{}}}{}%
   &
-  % Séptimo -opcional- campo: IVA.
-  \ifbool{IVA}{%
-   \David at XRight{\@IVAAuxCmd{%
-    \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
+  % Avanzamos a la cantidad, o la descripción.
+  \ifbool{SinCantidad}{}{\ifbool{PrimeroDescripcion}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}}}%
+  &% Avanzamos hasta la descripción, la cantidad o el precio unitario.
+  \ifbool{SinCantidad}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}}
+   {\if at cdu \@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}\fi
+    \ifdcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}\fi
+    \ifduc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}\fi}%
+  &% Avanzamos hasta el precio unitario, o la cantidad, o columna fantasma cuando es 'sincantidad'.
+  \ifbool{SinCantidad}{}
+   {%
+    \mbox{}\hfill
+    \ifduc
+     \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}%
     \else
-     \mbox{}\hfill \@LetraNumeros \numprint{\csname @Alicuota##1porc\endcsname}\%\hfill\mbox{}%
-    \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq.
-  &
-  % Octavo campo: El total.
-  \David at XRight{\@PrecioTAuxCmd{%
-   \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
+     \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}%
+    \fi}%
+  &% Avanzamos hasta el subtotal, que puede o no existir,
+  \ifbool{Subtotal}{\@PrecioSAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioS \space (\Moneda)\hfill\mbox{}}}{}%
+  &% Avanzamos hasta el descuento, que puede o no existir.
+  \ifdescuentos \@DescuentoAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Descuento \hfill\mbox{}}\fi
+  &% Avanzamos hasta el IVA, que puede o no existir.
+  \ifbool{IVA}{\@IVAAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@IVA \hfill\mbox{}}}{}
+  &% Avanzamos hasta el precio total.
+  \@PrecioTAuxCmd{\mbox{}\hfill \@LetraTitColumnas \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\Moneda)\hfill\mbox{}}%
+  \if at LineaCompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi
+  \\
+  \ifbool{SinLineasHoriInt}{}{\hline}%
+  %
+  #1% Aquí entran todos los items que el usuario declara dentro del ambiente.
+  \@CalculaSeparaItemsExtraFinal
+  \\[\@SeparaItemsExtraFinal]% El último fin de línea se hace aquí.
+  \ifconlineasha\hline\fi% Se verifica si hace falta una línea horizontal o no.
+  \iffilas
+   % Esto en lugar de \ifexpandecuadro para que no se haga una linea vacía en la tabla cuando la caja está vacía.
+   \ifdim \ht\@CajaEspacioVacio=0pt
+    \ifdefvoid{\@NotaInterna}{%
+     \ifbool{SinLineasHoriExt}{}{%
+      \ifconlineasha\else\hline\fi}% Verificamos si hay que poner la línea horizontal. Si está 'conlineasha' ya salió debido a esta opción.
+     }{\@ColumnasMultiColumnNotaIntAuxCmd\ifbool{SinLineasHoriExt}{}{\hline}}%
    \else
-    \if at impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioT}
-   \fi}}%
-  % Escribimos al csv.
-  \if at csv
-   \IfValueTF{##4}{\@EscribeItemsEnCSV{##1}{##2}{##4}}{\@EscribeItemsEnCSV{##1}{##2}{##3}}%
-  \fi}%
- %
- % Comando para escribir en el .csv.
- \newcommand{\@EscribeItemsEnCSV}[3]{%
-  \ifbool{SinCantidad}
-  {\if at descuentos
-    \immediate\write\csv{"\unexpanded{##3}","\Dcto","\PrecioT","##1"}%
+    \ifbool{PrimeroDescripcion}{&\usebox{\@CajaEspacioVacio}&&&&&&\\}{&&\usebox{\@CajaEspacioVacio}&&&&&\\}%
+    \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}%
+    \ifbool{SinLineasHoriExt}{}{\hline}% Siempre que hay relleno se pone la línea acá.
+   \fi
+  \else
+   \ifbool{SinLineasHoriInt}{}{\ifconlineasha\else\hline\fi}% Línea que cierra los ítems en la tabla.
+   % Agregamos el espacio espúreo.
+   \ifdim \ht\@CajaEspacioVacio=0pt
    \else
-    \immediate\write\csv{"\unexpanded{##3}","\PrecioT","##1"}%
-   \fi}
-  {\if at cdu
-    \if at descuentos
-     \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\Dcto","\PrecioT","##1"}%
+    % Rellenamos la tabla con espacio espúreo, y le agregamos las lineas externas, si aplica.
+    \ifbool{SinLineasVertExt}{\multicolumn{8}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{8}{|c|}{\usebox{\@CajaEspacioVacio}}}\\
+   \fi
+   % Si pedimos sin totalizaciones, entonces cerramos la tabla ya, si no, calculamos los totales y los escribimos
+   \ifsintotales
+   \else
+    % Modo de columnas: Abrimos la tabla para escribir los totales, y le agregamos las líneas verticales externas, si aplica.
+    \@ColumnasMultiColumnTotalesAuxCmd
+    \@CalculaTotalesI
+    \ifagrupado
+     \@EscribeTotalColAgrupado
     \else
-     \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\PrecioT","##1"}%
+     \if at Exento \@EscribeTotalCol{E}\fi
+     \if at BIR\@EscribeTotalCol{R}\ifsinivaexpresado\else\@EscribeTotalColAlicuota{R}\fi\fi
+     \@EscribeTotalCol{G}\ifsinivaexpresado\else\@EscribeTotalColAlicuota{G}\fi
+     \ifbool{Electro}{\@EscribeTotalColAlicuotaGDesc}{}%
+     \if at BIA\@EscribeTotalCol{A}\ifsinivaexpresado\else\@EscribeTotalColAlicuota{A}\fi\fi
     \fi
+    \ifsinivaexpresado\else\cline{2-2}\fi
+    \hfill \@LetraTitTotal\@@Total & \@LetraNumTotal\numprint{\Total}\\
+    \end{tabular}\endgroup
+    \\
+    \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}%
+    \ifbool{SinLineasHoriExt}{}{\hline}%
    \fi
-   \if at dcu
-    \if at descuentos
-     \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\Dcto","\PrecioT","##1"}%
+  \fi
+  \end{tabularx}%
+  %
+  % Generamos la macro \Total vacía para que no dé error en algún posible uso dentro del documento.
+  \ifsintotales\gdef\Total{}\fi
+  % Si pedimos no totalizar (sintotales), la opción filas queda desactivada.
+  \iffilas
+   \@CalculaTotalesI
+   \@LetraNumTotales
+   \vspace*{\@SeparaVertical}\par
+   \ifexpandecuadro\else\vfill\fi
+   \@GeneraCajasTotalesFilas
+   \newbox{\@CajaTotal}%
+   \savebox{\@CajaTotal}{{\@LetraTitTotal\@@Total}: \@LetraNumTotal\numprint{\Total}}%
+   %
+   \ifnum \value{@IVANoGeneral}=0%
+    \newbox{\@CajaGET}%
+    \savebox{\@CajaGET}{\@EscribeTotalesFilasGET}%
+    \ifdim \the\wd\@CajaGET < \textwidth
+     \parbox{\textwidth}{\@EscribeTotalesFilasGET}%
     \else
-     \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\PrecioT","##1"}%
+     \hspace*{\@SepTotales}%
+     \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}%
+     \if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
+     \ifcentrado\hspace*{\@SepTotales}\fi
     \fi
    \fi
-   \if at duc
-    \if at descuentos
-     \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\Dcto","\PrecioT","##1"}%
+   \ifnum \value{@IVANoGeneral}=1%
+    \newbox{\@CajaGxET}%
+    \savebox{\@CajaGxET}{\@EscribeTotalesFilasGxET}%
+    \ifdim \the\wd\@CajaGxET < \textwidth
+     \@EscribeTotalesFilasGxET
     \else
-     \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\PrecioT","##1"}%
-    \fi
-   \fi}}%
- %
- % Usamos la definición de \label at factura dentro del entorno de la factura para que sea local aquí nada más.
- \let\label\label at factura
- \@LetraItems% Este es el tipo de letra que tendrán los ítems, y en este tipo de letra se define el \baselineskip de toda la factura.
- \@FacturaAuxInicioCmd
- \ifbool{SinLineasHoriExt}{}{\hline}%
- \@ZERO
- % Estamos en el número del ítem, si aplicara.
- \if at LineaDesdeInicio \hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}\fi
- \ifbool{NumItem}{\@NumItemAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@NumItem \hfill\mbox{}}}{}%
- &
- % Avanzamos a la cantidad, o la descripción.
- \ifbool{SinCantidad}{}{\ifbool{PrimeroDescripcion}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}}}%
- &% Avanzamos hasta la descripción, la cantidad o el precio unitario.
- \ifbool{SinCantidad}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}}
-  {\if at cdu \@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}\fi
-   \if at dcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}\fi
-   \if at duc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}\fi}%
- &% Avanzamos hasta el precio unitario, o la cantidad, o columna fantasma cuando es 'sincantidad'.
- \ifbool{SinCantidad}{}
-  {%
-   \mbox{}\hfill
-   \if at duc
-    \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}%
-   \else
-    \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}%
-   \fi}%
- &% Avanzamos hasta el subtotal, que puede o no existir,
- \ifbool{Subtotal}{\@PrecioSAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioS \space (\Moneda)\hfill\mbox{}}}{}%
- &% Avanzamos hasta el descuento, que puede o no existir.
- \if at descuentos \@DescuentoAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Descuento \hfill\mbox{}}\fi
- &% Avanzamos hasta el IVA, que puede o no existir.
- \ifbool{IVA}{\@IVAAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@IVA \hfill\mbox{}}}{}
- &% Avanzamos hasta el precio total.
- \@PrecioTAuxCmd{\mbox{}\hfill \@LetraTitColumnas \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\Moneda)\hfill\mbox{}}%
- \if at LineaCompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi
- \\
- \ifbool{SinLineasHoriInt}{}{\hline}%
- %
- #1% Aquí entran todos los items que el usuario declara dentro del ambiente.
- \@CalculaSeparaItemsExtraFinal
- \\[\@SeparaItemsExtraFinal]% El último fin de línea se hace aquí.
- \if at conlineasha\hline\fi% Se verifica si hace falta una línea horizontal o no.
- \if at filas
-  % Esto en lugar de \if at expandecuadro para que no se haga una linea vacía en la tabla cuando la caja está vacía.
-  \ifdim \ht\@CajaEspacioVacio=0pt
-   \ifdefvoid{\@NotaInterna}{%
-    \ifbool{SinLineasHoriExt}{}{%
-     \if at conlineasha\else\hline\fi}% Verificamos si hay que poner la línea horizontal. Si está 'conlineasha' ya salió debido a esta opción.
-    }{\@ColumnasMultiColumnNotaIntAuxCmd\ifbool{SinLineasHoriExt}{}{\hline}}%
-  \else
-   \ifbool{PrimeroDescripcion}{&\usebox{\@CajaEspacioVacio}&&&&&&\\}{&&\usebox{\@CajaEspacioVacio}&&&&&\\}%
-   \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}%
-   \ifbool{SinLineasHoriExt}{}{\hline}% Siempre que hay relleno se pone la línea acá.
-  \fi
- \else
-  \ifbool{SinLineasHoriInt}{}{\if at conlineasha\else\hline\fi}% Línea que cierra los ítems en la tabla.
-  % Agregamos el espacio espúreo.
-  \ifdim \ht\@CajaEspacioVacio=0pt
-  \else
-   % Rellenamos la tabla con espacio espúreo, y le agregamos las lineas externas, si aplica.
-   \ifbool{SinLineasVertExt}{\multicolumn{8}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{8}{|c|}{\usebox{\@CajaEspacioVacio}}}\\
-  \fi
-  % Si pedimos sin totalizaciones, entonces cerramos la tabla ya, si no, calculamos los totales y los escribimos
-  \if at sintotales
-  \else
-   % Modo de columnas: Abrimos la tabla para escribir los totales, y le agregamos las líneas verticales externas, si aplica.
-   \@ColumnasMultiColumnTotalesAuxCmd
-   \@CalculaTotalesI
-   \if at agrupado
-    \@EscribeTotalColAgrupado
-   \else
-    \if at Exento \@EscribeTotalCol{E}\fi
-    \if at BIR\@EscribeTotalCol{R}\if at sinivaexpresado\else\@EscribeTotalColAlicuota{R}\fi\fi
-    \@EscribeTotalCol{G}\if at sinivaexpresado\else\@EscribeTotalColAlicuota{G}\fi
-    \ifbool{Electro}{\@EscribeTotalColAlicuotaGDesc}{}%
-    \if at BIA\@EscribeTotalCol{A}\if at sinivaexpresado\else\@EscribeTotalColAlicuota{A}\fi\fi
-   \fi
-   \if at sinivaexpresado\else\cline{2-2}\fi
-   \hfill \@LetraTitTotal\@@Total & \@LetraNumTotal\numprint{\Total}\\
-   \end{tabular}\endgroup
-   \\
-   \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}%
-   \ifbool{SinLineasHoriExt}{}{\hline}%
-  \fi
- \fi
- \end{tabularx}%
- %
- % Generamos la macro \Total vacía para que no dé error en algún posible uso dentro del documento.
- \if at sintotales\gdef\Total{}\fi
- % Si pedimos no totalizar (sintotales), la opción filas queda desactivada.
- \if at filas
-  \@CalculaTotalesI
-  \@LetraNumTotales
-  \vspace*{\@SeparaVertical}\par
-  \if at expandecuadro\else\vfill\fi
-  \@GeneraCajasTotalesFilas
-  \newbox{\@CajaTotal}%
-  \savebox{\@CajaTotal}{{\@LetraTitTotal\@@Total}: \@LetraNumTotal\numprint{\Total}}%
-  %
-  \ifnum \value{@IVANoGeneral}=0%
-   \newbox{\@CajaGET}%
-   \savebox{\@CajaGET}{\@EscribeTotalesFilasGET}%
-   \ifdim \the\wd\@CajaGET < \textwidth
-    \parbox{\textwidth}{\@EscribeTotalesFilasGET}%
-   \else
-    \hspace*{\@SepTotales}%
-    \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}%
-    \if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
-    \if at centrado\hspace*{\@SepTotales}\fi
-   \fi
-  \fi
-  \ifnum \value{@IVANoGeneral}=1%
-   \newbox{\@CajaGxET}%
-   \savebox{\@CajaGxET}{\@EscribeTotalesFilasGxET}%
-   \ifdim \the\wd\@CajaGxET < \textwidth
-    \@EscribeTotalesFilasGxET
-   \else
-    \hspace*{\@SepTotales}%
-    \if at BIR\usebox{\@CajaBIAliR}\hspace*{\@SepTotales}\fi
-    \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}%
-    \if at BIA\usebox{\@CajaBIAliA}\hspace*{\@SepTotales}\fi
-    \\[\@SeparaFilas]\mbox{}%
-    \if at centrado\hspace*{\@SepTotales}\else\hfill\fi
-    \if at Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}%
-    \if at centrado\hspace*{\@SepTotales}\fi
-   \fi
-  \fi
-  \ifnum \value{@IVANoGeneral}=2%
-  \newbox{\@CajaRGAET}%
-  \savebox{\@CajaRGAET}{\@EscribeTotalesFilasRGAET}%
-   \ifdim \the\wd\@CajaRGAET < \textwidth
-    \@EscribeTotalesFilasRGAET
-   \else
-    \newbox{\@CajaRGA}%
-    \savebox{\@CajaRGA}{\@EscribeTotalesFilasRGA}%
-    \ifdim \the\wd\@CajaRGA < \textwidth
-     \@EscribeTotalesFilasRGA
+     \hspace*{\@SepTotales}%
+     \if at BIR\usebox{\@CajaBIAliR}\hspace*{\@SepTotales}\fi
+     \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}%
+     \if at BIA\usebox{\@CajaBIAliA}\hspace*{\@SepTotales}\fi
      \\[\@SeparaFilas]\mbox{}%
-     \if at centrado\hspace*{\@SepTotales}\else\hfill\fi
+     \ifcentrado\hspace*{\@SepTotales}\else\hfill\fi
      \if at Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}%
-     \if at centrado\hspace*{\@SepTotales}\fi
-    \else% Aquí casi cualquier cosa tiene aspecto feo.
-     \CLASSWARNING{Es mejor no usar la opción de totalización en filas en este caso, o disminuir los tamaños de los tipos de letra para la totalización}%
-     \centering{%
-      \begin{tabular}{r@{\hspace*{\@SeparaMinTotales}}l}
-       \usebox{\@CajaBIAliR} & \usebox{\@CajaBIAliA} \\[\@SeparaFilas]
-       \usebox{\@CajaBIAliG} & \if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
-      \end{tabular}}%
+     \ifcentrado\hspace*{\@SepTotales}\fi
     \fi
    \fi
-  \fi
- \fi
- \par
- \if at expandecuadro
-  \vspace*{-\@EspacioVacioInicial}%
-  \vspace*{\@EspacioVacioFinal}%
-  \zsaveposy{EspacioVacioInicial}%
- \fi
- \vfill
- \if at expandecuadro\zsaveposy{EspacioVacioFinal}\fi
- \vspace*{\@SeparaVertical}\par
- \ifdefvoid{\@NotaExterna}{}{\parbox[t]{\linewidth}{\@LetraNotaExterna\@NotaExterna}\vspace*{\@SeparaVertical}\par}}
-
- \ifbool{SinCantidad}
- % Definamos todos los comandos \Item***. El descuento es opcional; por eso usamos G{0} en \NewDocumentCommand.
- {%
-  \NewDocumentCommand{\Item}{m o m G{0}}{\@ITEM{G}{1}{#1}[#2]{#3}{#4}}% Ítem normal.
-  \NewDocumentCommand{\ItemR}{m o m G{0}}{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA reducido.
-  \NewDocumentCommand{\ItemA}{m o m G{0}}{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA adicional.
-  \NewDocumentCommand{\ItemE}{m o m G{0}}{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{1}{#1}[#2]{#3}{#4}}% Ítem exento de IVA.
-  \NewDocumentCommand{\ItemX}{m o}{\@ITEM{X}{1}{#1}[#2]{0}{0}}% Ítem sin precio.
-  \let\ItemG\Item
-  \if at csv
-   \if at descuentos
-    \immediate\write\csv{"\@@Descripcion","\@@Descuento","\@@Precio \space (\Moneda)","\@@IVA"}%
-   \else
-    \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\Moneda)","\@@IVA"}%
-   \fi
-  \fi}
- {%
-  \NewDocumentCommand{\Item}{m m o m G{0}}{\@ITEM{G}{#1}{#2}[#3]{#4}{#5}}% Ítem normal.
-  \NewDocumentCommand{\ItemR}{m m o m G{0}}{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA reducido.
-  \NewDocumentCommand{\ItemA}{m m o m G{0}}{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA adicional.
-  \NewDocumentCommand{\ItemE}{m m o m G{0}}{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{#1}{#2}[#3]{#4}{#5}}% Ítem exento de IVA.
-  \NewDocumentCommand{\ItemX}{m m o}{\@ITEM{X}{#1}{#2}[#3]{0}{0}}% Ítem sin precio.
-  \let\ItemG\Item
-  \if at csv
-   \if at cdu
-    \if at descuentos
-     \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+   \ifnum \value{@IVANoGeneral}=2%
+   \newbox{\@CajaRGAET}%
+   \savebox{\@CajaRGAET}{\@EscribeTotalesFilasRGAET}%
+    \ifdim \the\wd\@CajaRGAET < \textwidth
+     \@EscribeTotalesFilasRGAET
     \else
-     \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \newbox{\@CajaRGA}%
+     \savebox{\@CajaRGA}{\@EscribeTotalesFilasRGA}%
+     \ifdim \the\wd\@CajaRGA < \textwidth
+      \@EscribeTotalesFilasRGA
+      \\[\@SeparaFilas]\mbox{}%
+      \ifcentrado\hspace*{\@SepTotales}\else\hfill\fi
+      \if at Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}%
+      \ifcentrado\hspace*{\@SepTotales}\fi
+     \else% Aquí casi cualquier cosa tiene aspecto feo.
+      \CLASSWARNING{Es mejor no usar la opción de totalización en filas en este caso, o disminuir los tamaños de los tipos de letra para la totalización}%
+      \centering{%
+       \begin{tabular}{r@{\hspace*{\@SeparaMinTotales}}l}
+        \usebox{\@CajaBIAliR} & \usebox{\@CajaBIAliA} \\[\@SeparaFilas]
+        \usebox{\@CajaBIAliG} & \if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
+       \end{tabular}}%
+     \fi
     \fi
    \fi
-   \if at dcu
-    \if at descuentos
-     \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+  \fi
+  \par
+  \ifexpandecuadro
+   \vspace*{-\@EspacioVacioInicial}%
+   \vspace*{\@EspacioVacioFinal}%
+   \zsaveposy{EspacioVacioInicial}%
+  \fi
+  \vfill
+  \ifexpandecuadro\zsaveposy{EspacioVacioFinal}\fi
+  \vspace*{\@SeparaVertical}\par
+  \ifdefvoid{\@NotaExterna}{}{\parbox[t]{\linewidth}{\@LetraNotaExterna\@NotaExterna}\vspace*{\@SeparaVertical}\par}}
+
+  \ifbool{SinCantidad}
+  % Definamos todos los comandos \Item***. El descuento es opcional; por eso usamos G{0} en \NewDocumentCommand.
+  {%
+   \NewDocumentCommand{\Item}{m o m G{0}}{\@ITEM{G}{1}{#1}[#2]{#3}{#4}}% Ítem normal.
+   \NewDocumentCommand{\ItemR}{m o m G{0}}{\global\@BIRtrue\global\Gtrue\@ITEM{R}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA reducido.
+   \NewDocumentCommand{\ItemA}{m o m G{0}}{\global\@BIAtrue\global\Gtrue\@ITEM{A}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA adicional.
+   \NewDocumentCommand{\ItemE}{m o m G{0}}{\global\@Exentotrue\global\Gtrue\@ITEM{E}{1}{#1}[#2]{#3}{#4}}% Ítem exento de IVA.
+   \NewDocumentCommand{\ItemX}{m o}{\@ITEM{X}{1}{#1}[#2]{0}{0}}% Ítem sin precio.
+   \let\ItemG\Item
+   \ifcsv
+    \ifdescuentos
+     \immediate\write\csv{"\@@Descripcion","\@@Descuento","\@@Precio \space (\Moneda)","\@@IVA"}%
     \else
-     \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\Moneda)","\@@IVA"}%
     \fi
+   \fi}
+  {%
+   \NewDocumentCommand{\Item}{m m o m G{0}}{\@ITEM{G}{#1}{#2}[#3]{#4}{#5}}% Ítem normal.
+   \NewDocumentCommand{\ItemR}{m m o m G{0}}{\global\@BIRtrue\global\Gtrue\@ITEM{R}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA reducido.
+   \NewDocumentCommand{\ItemA}{m m o m G{0}}{\global\@BIAtrue\global\Gtrue\@ITEM{A}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA adicional.
+   \NewDocumentCommand{\ItemE}{m m o m G{0}}{\global\@Exentotrue\global\Gtrue\@ITEM{E}{#1}{#2}[#3]{#4}{#5}}% Ítem exento de IVA.
+   \NewDocumentCommand{\ItemX}{m m o}{\@ITEM{X}{#1}{#2}[#3]{0}{0}}% Ítem sin precio.
+   \let\ItemG\Item
+   \ifcsv
+    \if at cdu
+     \ifdescuentos
+      \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \else
+      \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \fi
+    \fi
+    \ifdcu
+     \ifdescuentos
+      \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \else
+      \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \fi
+    \fi
+    \ifduc
+     \ifdescuentos
+      \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \else
+      \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \fi
+    \fi
+   \fi}
+
+ \if at factura
+  % Los descuentos totales no son compatibles -y no creo que lo vayan a ser- con el modo de totalización en filas.
+  \iffilas
+   \if at DescuentoTotal
+    \CLASSWARNING{La opción 'filas' no es compatible con los descuentos totales; sin efecto opción 'filas'}
+    \filasfalse
    \fi
-   \if at duc
-    \if at descuentos
-     \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+  \fi
+  \if at reverso
+  \else
+    \RenewEnviron{reverso}{}
+  \fi
+  \ifcotizacion\def\@Denominacion{\@@DenomCotiza}\else\def\@Denominacion{\@@DenomFactura}\fi%  Fijamos la denominación del documento paras las cotizaciones o facturas, que son casos particulares del modo 'factura'.
+  \expandafter\geometry\expandafter{\@GeometriaFactura}%  La geometría debe aplicarse aquí.
+  \AfterEndPreamble{%
+   \addtolength{\@PosFechaX}{\oddsidemargin+1in}%  Le sumamos el margen izquierdo a las posiciones de las cosas; es importante que se haga en un \AfterEndPreamble antes de que empiecen a escribirse otras cosas en la página.
+   \addtolength{\@PosDenomX}{\oddsidemargin+1in}%
+   \addtolength{\@PosControlX}{\oddsidemargin+1in}%
+   \addtolength{\@PosCondicionesX}{\oddsidemargin+1in}%
+   \addtolength{\@PosFirmasXuno}{\oddsidemargin+1in}%
+   \setlength{\parindent}{0pt}%
+   \setlength{\lineskip}{0pt}%
+   \setlength{\parskip}{0pt plus 1pt}%
+   \expandafter\setlength{\@SepTotales}{\the\@SeparaMinTotales plus 1fill}% \@SeparaMinTotales es el mínimo espacio entre los totales en el modo 'filas', y SepTotales es una dimensión interna, estirable, con ese como su mínimo.
+   \thispagestyle{empty}%
+   \pagenumbering{roman}%
+   \@EncabezadoFactura
+   \@EscribeNotaPrevia}
+   \AtBeginShipoutNext{% Antes abría aquí un \AtBeginShipoutNext cuando había reporte y un \AtEndDocument cuando no. No es necesario eso. También lo modifiqué en \FirmaFactura.
+    \@CargaFondoFactura
+    \@PosicionaFechas
+    \ifdenom\@PosicionaDenom\fi
+    \ifprefactura\@PosicionaNumControl\fi
+    \ifnum\value{@Firmas}=0\else\@PosicionaFirmas\fi
+    \ifdefvoid{\@Condiciones}{}{\@PosicionaCondiciones}}
+  \iflinea
+   % Para determinar las coordenadas de la línea hay que usar \AtBeginShipoutNext porque si no se hace en el 'shipout' de la página se genera un espacio en blanco extra.
+   \AtBeginShipoutNext{\iflinea\@DibujaLinea\fi}
+    \iffilas
+     \ifbool{SinLineasVertInt}{\@LineaCompletatrue}
     \else
-     \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@PrecioT \space (\Moneda)","\@@IVA"}%
+     \@LineaHastaTotaltrue\@LineaDesdeIniciotrue
     \fi
-   \fi
-  \fi}
-
-\if at factura
- % Los descuentos totales no son compatibles -y no creo que lo vayan a ser- con el modo de totalización en filas.
- \if at filas
-  \if at DescuentoTotal
-   \CLASSWARNING{La opción 'filas' no es compatible con los descuentos totales; sin efecto opción 'filas'}
-   \@filasfalse
   \fi
- \fi
- \if at reverso
+  %% El comando para la descripción del servicio prestado.
+  \NewDocumentCommand{\Descripcion}{+m}{%
+   {% Abrimos un grupo adicional para que la redefinición del entorno 'tikzpicture' sea local.
+    \@LetraDescripcion
+    % Cuando la línea tiene grosor cero, hacemos que el entorno 'tikzpicture' sea "fake", y redefinimos \node para que obvie los parámetros que le dimos como argumento opcional.
+    \ifdim\@GrosorLineaDescripcion=0pt%
+     \setlength{\@SeparaInternaDescripcion}{0pt}\setlength{\@EsquinaLineaDescripcion}{0pt}\setlength{\@SombraDescripcion}{0pt}%
+     \renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}%
+    \fi
+    \begin{tikzpicture}
+     % Expandimos después para poderle pasar el contenido de la macro como argumento opcional a \node.
+     \expandafter\node\expandafter[\@DescripcionTIKZ]{%
+      \ifbool{ExpAbajo}
+       {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion]
+        {\textwidth-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion}}%
+       {\parbox[t]{\textwidth-\@SombraDescripcion-2\@SeparaInternaDescripcion-2\@GrosorLineaDescripcion}}%
+      {\setlength{\parindent}{0.5cm}%
+       \setlength{\parskip}{2pt plus 8pt}%
+       \ifbool{ExpAbajo}{\vfill}{}%
+        #1%
+       \ifbool{ExpAbajo}{\vfill}{}}}%
+     \ifdim\@GrosorLineaDescripcion=0pt\else ;\fi% El fin del nodo va cuando hay el entorno tikzpicture original.
+    \end{tikzpicture}
+    \par\vspace*{\@SombraDescripcion}}}%
  \else
-   \RenewEnviron{reverso}{}
+  \RenewEnviron{factura}{%
+   \@ZERO
+   \let\label\label at factura
+   \let\@ITEM\@CalculaItem
+   \BODY
+   \@CalculaTotalesI}
+  \RenewEnviron{reverso}{}
+  \NewDocumentCommand{\Descripcion}{+m}{}
  \fi
- \if at cotizacion\def\@Denominacion{\@@DenomCotiza}\else\def\@Denominacion{\@@DenomFactura}\fi%  Fijamos la denominación del documento paras las cotizaciones o facturas, que son casos particulares del modo 'factura'.
- \AtEndPreamble{\expandafter\geometry\expandafter{\@GeometriaFactura}}%  La geometría debe aplicarse aquí.
- \AtBeginDocument{%
-  \addtolength{\@PosFechaX}{\oddsidemargin+1in}%  Le sumamos el margen izquierdo a las posiciones de las cosas; importante que se haga en un \AtBeginDocument antes de que empiecen a escribirse otras cosas que también se agregan a \AtBeginDocument.
-  \addtolength{\@PosDenomX}{\oddsidemargin+1in}%
-  \addtolength{\@PosControlX}{\oddsidemargin+1in}%
-  \addtolength{\@PosCondicionesX}{\oddsidemargin+1in}%
-  \addtolength{\@PosFirmasXuno}{\oddsidemargin+1in}%
-  \setlength{\parindent}{0pt}%
-  \setlength{\lineskip}{0pt}%
-  \setlength{\parskip}{0pt plus 1pt}%
-  \expandafter\setlength{\@SepTotales}{\the\@SeparaMinTotales plus 1fill}% \@SeparaMinTotales es el mínimo espacio entre los totales en el modo 'filas', y SepTotales es una dimensión interna, estirable, con ese como su mínimo.
-  \thispagestyle{empty}%
-  \pagenumbering{roman}%
-  \@EncabezadoFactura
-  \@EscribeNotaPrevia}
-  \AtBeginShipoutNext{% Antes abría aquí un \AtBeginShipoutNext cuando había reporte y un \AtEndDocument cuando no. No es necesario eso. También lo modifiqué en \FirmaFactura.
-   \@CargaFondoFactura
-   \@PosicionaFechas
-   \if at denom\@PosicionaDenom\fi
-   \if at prefactura\@PosicionaNumControl\fi
-   \if at sinfirmas\else\@PosicionaFirmas\fi
-   \ifdefvoid{\@Condiciones}{}{\@PosicionaCondiciones}}
- \if at linea
-  \RequirePackage{zref-savepos}
-  % Para determinar las coordenadas de la línea hay que usar \AtBeginShipoutNext porque si no se hace en el 'shipout' de la página se genera un espacio en blanco extra.
-  \AtBeginShipoutNext{\if at linea\@DibujaLinea\fi}
-   \if at filas
-    \ifbool{SinLineasVertInt}{\@LineaCompletatrue}
-   \else
-    \@LineaHastaTotaltrue\@LineaDesdeIniciotrue
-   \fi
- \fi
- %% El comando para la descripción del servicio prestado.
- \NewDocumentCommand{\Descripcion}{+m}{%
-  {% Abrimos un grupo adicional para que la redefinición del entorno 'tikzpicture' sea local.
-   \@LetraDescripcion
-   % Cuando la línea tiene grosor cero, hacemos que el entorno 'tikzpicture' sea "fake", y redefinimos \node para que obvie los parámetros que le dimos como argumento opcional.
-   \ifdim\@GrosorLineaDescripcion=0pt%
-    \setlength{\@SeparaInternaDescripcion}{0pt}\setlength{\@EsquinaLineaDescripcion}{0pt}\setlength{\@SombraDescripcion}{0pt}%
-    \renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}%
-   \fi
-   \begin{tikzpicture}
-    % Expandimos después para poderle pasar el contenido de la macro como argumento opcional a \node.
-    \expandafter\node\expandafter[\@DescripcionTIKZ]{%
-     \ifbool{ExpAbajo}
-      {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion]
-       {\textwidth-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion}}%
-      {\parbox[t]{\textwidth-\@SombraDescripcion-2\@SeparaInternaDescripcion-2\@GrosorLineaDescripcion}}%
-     {\setlength{\parindent}{0.5cm}%
-      \setlength{\parskip}{2pt plus 8pt}%
-      \ifbool{ExpAbajo}{\vfill}{}%
-       #1%
-      \ifbool{ExpAbajo}{\vfill}{}}}%
-    \ifdim\@GrosorLineaDescripcion=0pt\else ;\fi% El fin del nodo va cuando hay el entorno tikzpicture original.
-   \end{tikzpicture}
-   \par\vspace*{\@SombraDescripcion}}}%
-\else
- \RenewEnviron{factura}{%
-  \@ZERO
-  \let\label\label at factura
-  \let\@ITEM\@CalculaItem
-  \BODY
-  \@CalculaTotalesI}
- \RenewEnviron{reverso}{}
- \NewDocumentCommand{\Descripcion}{+m}{}
-\fi
 
-\if at reporte
- \ifdefvoid{\@InfoPagina}{\let\@InfoPagina\@InfoPaginaNoTitulo}{}%
- \if at factura
- \else
-  \AtEndPreamble{%
-  \expandafter\geometry\expandafter{\@GeometriaReporte}}%  La geometría del reporte debe aplicarse aquí cuando sólo hay reporte, así se puede establecer el tamaño del papel.
- \fi
- \NewEnviron{reporte}{%
+ \if at reporte
+  \ifdefvoid{\@InfoPagina}{\let\@InfoPagina\@InfoPaginaNoTitulo}{}%
   \if at factura
-   \expandafter\newgeometry\expandafter{\@GeometriaReporte}\cleardoublepage%  La geometría debe aplicarse aquí cuando también hay factura, pero no se puede cambiar el tamaño del papel.
+  \else
+   \expandafter\geometry\expandafter{\@GeometriaReporte}%  La geometría del reporte debe aplicarse aquí cuando sólo hay reporte, así se puede establecer el tamaño del papel.
   \fi
-  \let\headwidth\textwidth
-  \@CargaFondoReporte
-  \@EncabezadoReporte
-  \ifdefvoid{\@EstiloPagReporteResto}{%
-   \if at FondoReporteStar%  Si no usamos \EstiloPagReporte entonces se fijará 'soloabajo' cuando se use \FondoReporte* para que sólo use marcas de pie de página, y si no se usó \FondoReporte* entonces se fijará 'plain' que usa cabeceras y pies de página.
-    \pagestyle{soloabajo}%
-   \else
-    \pagestyle{plain}%
-   \fi}
-   {\pagestyle{\@EstiloPagReporteResto}}%  Si usamos \EstiloPagReporte en su argumento obligatorio entonces fijamos ese estilo de página.
-  \ifdefvoid{\@EstiloPagReporteUno}{%
-   \if at FondoReporte%  Si no le damos a \EstiloPagReporte su argumento opcional, entonces se fijará 'solonumpag' como el estilo de página para la primera página, pero solamente si usamos \FondoReporte, ya que el estilo de página predeterminado al usar \FondoReporte* ya se acaba de fijar y no necesita el caso especial de la primera hoja (\thispagestyle).
-    \if at FondoReporteStar
+  \NewEnviron{reporte}{%
+   \if at factura
+    \expandafter\newgeometry\expandafter{\@GeometriaReporte}\cleardoublepage%  La geometría debe aplicarse aquí cuando también hay factura, pero no se puede cambiar el tamaño del papel.
+   \fi
+   \let\headwidth\textwidth
+   \@CargaFondoReporte
+   \@EncabezadoReporte
+   \ifdefvoid{\@EstiloPagReporteResto}{%
+    \if at FondoReporteStar%  Si no usamos \EstiloPagReporte entonces se fijará 'soloabajo' cuando se use \FondoReporte* para que sólo use marcas de pie de página, y si no se usó \FondoReporte* entonces se fijará 'plain' que usa cabeceras y pies de página.
+     \pagestyle{soloabajo}%
     \else
-     \thispagestyle{solonumpag}%
-    \fi
-   \fi}
-   {\thispagestyle{\@EstiloPagReporteUno}}%  Si usamoe el argumento opcional de \EstiloPagReporte establecemos ese estilo de página.
-  \pagenumbering{arabic}%
-  \setlength{\parindent}{0.666cm}%
-  \setlength{\parskip}{4pt plus 6pt minus 2pt}% separación entre párrafos en el reporte.
-  \vskip\baselineskip
-  \BODY\clearpage}% espacio antes de empezar con el reporte, después del título -si lo hubiera-.
-\else
- \NewEnviron{reporte}{}
-\fi
+     \pagestyle{plain}%
+    \fi}
+    {\pagestyle{\@EstiloPagReporteResto}}%  Si usamos \EstiloPagReporte en su argumento obligatorio entonces fijamos ese estilo de página.
+   \ifdefvoid{\@EstiloPagReporteUno}{%
+    \if at FondoReporte%  Si no le damos a \EstiloPagReporte su argumento opcional, entonces se fijará 'solonumpag' como el estilo de página para la primera página, pero solamente si usamos \FondoReporte, ya que el estilo de página predeterminado al usar \FondoReporte* ya se acaba de fijar y no necesita el caso especial de la primera hoja (\thispagestyle).
+     \if at FondoReporteStar
+     \else
+      \thispagestyle{solonumpag}%
+     \fi
+    \fi}
+    {\thispagestyle{\@EstiloPagReporteUno}}%  Si usamoe el argumento opcional de \EstiloPagReporte establecemos ese estilo de página.
+   \pagenumbering{arabic}%
+   \setlength{\parindent}{0.666cm}%
+   \setlength{\parskip}{4pt plus 6pt minus 2pt}% separación entre párrafos en el reporte.
+   \vskip\baselineskip
+   \BODY\clearpage}% espacio antes de empezar con el reporte, después del título -si lo hubiera-.
+ \else
+  \NewEnviron{reporte}{}
+ \fi}
 
 %% Comando para el diseño de la forma libre.
 \newcommand{\@CargaFondoFactura}{%
@@ -1995,7 +2158,7 @@
      \ifdim\@GrosorLineaNotaPrevia=0pt\else ;\fi
    \end{tikzpicture}%
    \par\vspace*{\@SombraNotaPrevia}\vspace*{\@SeparaVertical}%
-   \if at expandecuadro\else\vfill\fi}}}
+   \ifexpandecuadro\else\vfill\fi}}}
 
 %% Comando que coloca la caja para las condiciones, con la posibilidad de TikZ.
 \newcommand{\@EscribeCondiciones}{%
@@ -2040,7 +2203,7 @@
  \setlength{\@LineaNodoXf}{\zposx{LineaNodoBCoordX} sp}%
  \setlength{\@LineaNodoYf}{\zposy{LineaNodoBCoordY} sp}%
  \addtolength{\@LineaNodoYo}{\@EspacioVacioInicial-\@EspacioVacioFinal}%
- \if at filas
+ \iffilas
  \else
   \if at DescG \addtolength{\@LineaNodoYo}{2\baselineskip}\fi
   \if at DescR \if at BIR \addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi
@@ -2047,7 +2210,7 @@
   \if at DescA \if at BIA \addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi
   \if at DescE \if at Exento \addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi
   \addtolength{\@LineaNodoYo}{\baselineskip/2}%
-  \if at sinivaexpresado
+  \ifsinivaexpresado
   \else
    \addtolength{\@LineaNodoYo}{2\baselineskip}%
    \if at BIR\addtolength{\@LineaNodoYo}{2\baselineskip}\fi
@@ -2055,7 +2218,7 @@
    \if at Exento\addtolength{\@LineaNodoYo}{\baselineskip}\fi
   \fi
  \fi
- \if at linea
+ \iflinea
   \begin{textblock*}{\paperwidth-\@LineaNodoXo}(\@LineaNodoXo,\paperheight-\@LineaNodoYo)%
    \begin{tikzpicture}%
     \draw (\@LineaNodoXo,\@LineaNodoYo) -- (\@LineaNodoXf,\@LineaNodoYf);%
@@ -2065,7 +2228,7 @@
 
 %% Escribimos los totales al archivo csv.
 \newcommand{\@EscribeTotalesEnCSV}{%
- \if at csv
+ \ifcsv
   \if at Exento
    \if at DescE
     \immediate\write\csv{Totales: \@@SubtotalE: \Moneda \SubtE^^JTotales: \@@DescuentoE: \Moneda \DescE}%

Modified: trunk/Master/texmf-dist/tex/latex/factura/factura.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/factura/factura.def	2018-03-13 21:51:13 UTC (rev 46948)
+++ trunk/Master/texmf-dist/tex/latex/factura/factura.def	2018-03-13 21:59:20 UTC (rev 46949)
@@ -36,7 +36,7 @@
 %% factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
 %% 
 \ProvidesFile{factura.def}
-[2017/12/11 v3.40
+[2018/03/13 v3.44
 Archivo de valores iniciales y condiciones de borde para factura.cls
 ]
 
@@ -137,8 +137,8 @@
 \def\flechaCR{%
  \raisebox{-0.4ex}{%
   \begin{tikzpicture}
-  \draw[line width=0.075ex] (0,0) arc (20:70:0.75ex) + (0,0) arc (-70:-20:0.75ex) ++ (0.8ex,0.55ex) arc (0:-100:1ex);
- \end{tikzpicture}}}
+   \draw[line width=0.075ex] (0,0) arc (20:70:0.75ex) + (0,0) arc (-70:-20:0.75ex) ++ (0.8ex,0.55ex) arc (0:-100:1ex);
+  \end{tikzpicture}}}
 
 %% Separación entre el inicio de una columna en la tabla y el inicio del texto.
 \tabcolsep=0.15cm
@@ -302,7 +302,7 @@
 %% El diseño de las distintas partes de la hoja.
 \newcommand{\@EstiloFirmas}{
  \@LetraFirmas
- \if at unafirma
+ \ifnum \value{@Firmas}=1
  \else
   \parbox{\@TamLineaFirmas}{
    \rule{\@TamLineaFirmas}{\@GrosorLineaFirmas}
@@ -311,7 +311,7 @@
  \hfill
  \parbox{\@TamLineaFirmas}{
   \rule{\@TamLineaFirmas}{\@GrosorLineaFirmas}
-  \centering \ifdefvoid{\@Emisor}{\if at cotizacion \@@Emisor \else \@@Pagado \fi}{\@Emisor}}}
+  \centering \ifdefvoid{\@Emisor}{\ifcotizacion \@@Emisor \else \@@Pagado \fi}{\@Emisor}}}
 
 \newcommand{\@EstiloNotaPrevia}{\@LetraNotaPrevia \@NotaPrevia}
 
@@ -326,7 +326,7 @@
 
 \newcommand{\@EstiloDenom}{%
  \@LetraDenom\@Denominacion
- \if at sinnumero
+ \ifsinnumero
  \else
   \space\space{\@LetraNumeracion N\textordmasculine\space\@Num}%
  \fi}
@@ -336,7 +336,7 @@
  \setlength{\tabcolsep}{0pt}%
  \@LetraFecha\begin{tabular}{r@{\extracolsep{1ex}}l@{\extracolsep{0pt}}}
  \@@Fecha & \ttfamily\@Fecha \\[.3em]
- \if at vencimiento \@@FechaVencimiento & \ttfamily\@FechaVencimiento \\ \else \vspace*{-.3em}\fi
+ \ifvencimiento \@@FechaVencimiento & \ttfamily\@FechaVencimiento \\ \else \vspace*{-.3em}\fi
  \end{tabular}}
 
 \newcommand{\@InfoPaginaNoTitulo}{\@LetraInfoPagina Reporte correspondiente a la factura n\'umero \@Num \space de fecha \@Fecha}



More information about the tex-live-commits mailing list