texlive[41538] Master/texmf-dist: factura (25jun16)
commits+karl at tug.org
commits+karl at tug.org
Sun Jun 26 00:10:38 CEST 2016
Revision: 41538
http://tug.org/svn/texlive?view=revision&revision=41538
Author: karl
Date: 2016-06-26 00:10:38 +0200 (Sun, 26 Jun 2016)
Log Message:
-----------
factura (25jun16)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura2.tex
trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura6.tex
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/factura-ejemplo-factura2.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura2.tex 2016-06-25 14:08:05 UTC (rev 41537)
+++ trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura2.tex 2016-06-25 22:10:38 UTC (rev 41538)
@@ -36,6 +36,7 @@
%%
%% Descripción de este ejemplo:
%% Escribimos una factura,
+%% Con la columna para enumerar los ítems (numitem),
%% Con descuentos individuales (descuentos),
%% Primero la descripción, luego la cantidad, luego el precio unitario (dcu),
%% Sin líneas verticales externas (sinlineasve),
@@ -51,6 +52,7 @@
%% Con descripción larga (\Descripcion).
%%
\documentclass[
+numitem,
descuentos,
dcu,
sinlineasve,
Modified: trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura6.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura6.tex 2016-06-25 14:08:05 UTC (rev 41537)
+++ trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura6.tex 2016-06-25 22:10:38 UTC (rev 41538)
@@ -36,6 +36,7 @@
%%
%% Descripción de este ejemplo:
%% Escribimos una factura,
+%% Con la columna para enumerar los ítems (numitem),
%% Escribe la denominación ("FACTURA") y el número (denom),
%% Sin líneas verticales externas (sinlineasve),
%% Sin líneas horizontales externas (sinlineashe),
@@ -48,6 +49,7 @@
%% Con descripción larga (\Descripcion).
%%
\documentclass[
+numitem,
denom,
sinlineasve,
% sinlineasv, % sin ninguna línea vertical
@@ -80,12 +82,13 @@
\begin{factura}
\Item{2}{ítem con IVA general}{1000}\label{primeritem}
+ \Item{4}{otro ítem con IVA general}{100}
\end{factura}
\Descripcion{Descripción larga del servicio.
- Se facturaron \cantref{primeritem} \descref{primeritem} por un valor de \Moneda\puref{primeritem} cada uno, dando un total de \Moneda\ptref{primeritem}. El IVA es de \Moneda\AlicuotaG, y el total final es \Moneda\Total.
- % También podemos usar \itemref{primeritem}, \dctoref{primeritem}, y en cuanto a las totalizaciones: \BIE, \BIR, \BIA, \AlicuotaR, \AlicuotaA, \SubtG, \SubtE, \SubtR, \SubtA, \DescG, \DescE, \DescR, \DescA para los demás totales.
+ 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 total de \Moneda\ptref{primeritem}, el IVA de este ítem es de \Moneda\AlicuotaG; luego se facturó otro ítem dando un total final de \Moneda\Total.
+ % También podemos usar \dctoref{primeritem} para la referencia al descuento, y en cuanto a las totalizaciones: \BIE, \BIR, \BIA, \AlicuotaR, \AlicuotaA, \SubtG, \SubtE, \SubtR, \SubtA, \DescG, \DescE, \DescR, \DescA para los demás totales.
}
\end{document}
Modified: trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex 2016-06-25 14:08:05 UTC (rev 41537)
+++ trunk/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex 2016-06-25 22:10:38 UTC (rev 41538)
@@ -74,6 +74,7 @@
\begin{factura}
\Item{2}{ítem con IVA general}{1000}\label{primeritem}
+ \Item{4}{otro ítem con IVA general}{100}
\end{factura}
\Descripcion{Descripción larga del servicio}
@@ -81,8 +82,8 @@
\begin{reporte}
El reporte - página 1\newpage El reporte - página 2 \newpage El reporte - página 3.
- Se facturaron \cantref{primeritem} \descref{primeritem} por un valor de \Moneda\puref{primeritem} cada uno, dando un total de \Moneda\ptref{primeritem}. El IVA es de \Moneda\AlicuotaG, y el total final es \Moneda\Total.
- % También podemos usar \itemref{primeritem}, \dctoref{primeritem}, y en cuanto a las totalizaciones: \BIE, \BIR, \BIA, \AlicuotaR, \AlicuotaA, \SubtG, \SubtE, \SubtR, \SubtA, \DescG, \DescE, \DescR, \DescA para los demás totales.
+ 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 total de \Moneda\ptref{primeritem}, el IVA de este ítem es de \Moneda\AlicuotaG; luego se facturó otro ítem dando un total final de \Moneda\Total.
+ % También podemos usar \dctoref{primeritem} para la referencia al descuento, y en cuanto a las totalizaciones: \BIE, \BIR, \BIA, \AlicuotaR, \AlicuotaA, \SubtG, \SubtE, \SubtR, \SubtA, \DescG, \DescE, \DescR, \DescA para los demás totales.
\end{reporte}
\end{document}
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 2016-06-25 14:08:05 UTC (rev 41537)
+++ trunk/Master/texmf-dist/source/latex/factura/factura.dtx 2016-06-25 22:10:38 UTC (rev 41538)
@@ -163,7 +163,7 @@
%<class>\ProvidesClass{factura}
%<def>\ProvidesFile{factura.def}
%<*class|def>
-[2016/05/16 v2.72
+[2016/06/25 v2.82
%<class>Clase para elaborar facturas legales
%<class>en la República Bolivariana de Venezuela.
%<def>Archivo valores iniciales y condiciones de borde para factura.cls
@@ -251,6 +251,10 @@
\clearpage
\addcontentsline{toc}{section}{\todoname}
\todos
+ \section*{Información específica de esta versión}
+ Para poder compilar con \LuaLaTeX{} es necesaria la versión v2.26 del paquete |zref|, de fecha 2016/05/21, y la versión v1.18 de |atbegshi| de fecha 2016/06/09.
+
+ Esta versión de |factura| se sacó principalmente para corregir un error introducido en la versión anterior v2.72 en cuanto a las referencias, para agregar la opción |numitem| que enumera los ítems en la factura y para que la línea diagonal (opción |linea|) funcione correctamente siempre.
\addcontentsline{toc}{section}{\changesname}
\PrintChanges
\addcontentsline{toc}{section}{\glosname}
@@ -299,7 +303,7 @@
% \changes{v2.05}{2015/04/13}{Se renombró la opción \texttt{relleno} a \texttt{exparriba}, a la vez que se quitó \cs{Descripcion*} porque se agregó la opción \texttt{sinexpandir}.}
% \changes{v2.05}{2015/04/13}{Se renombró la opción \texttt{ivanoexplicito} por \texttt{sinivaexpresado}.}
% \changes{v2.05}{2015/04/13}{Se cambiaron los \cs{AtBeginDocument} por \cs{AtBeginShipoutNext} de la factura porque daba problemas al especificar \texttt{conreporte} sin luego agregar el ambiente de reporte.}
-% \changes{v2.05}{2015/04/13}{Se colocó \cs{\@SeparaMinTotales} dentro de otro \cs{AtBeginDocument} más adecuado.}
+% \changes{v2.05}{2015/04/13}{Se colocó \cs{@SeparaMinTotales} dentro de otro \cs{AtBeginDocument} más adecuado.}
% \changes{v2.05}{2015/04/13}{Modificaciones en la documentación y en los ejemplos.}
% \changes{v2.05}{2015/04/13}{Los comandos \cs{ItemX} ahora colocan la línea bien con la opción \texttt{lineaitem}.}
% \changes{v2.1}{2015/08/26}{Advierte cuando la fecha del documento es distinta de la fecha del dia.}
@@ -336,9 +340,16 @@
% \changes{v2.6}{2016/03/07}{Cuando había descuentos totales y se pedía modo de totalización en filas, este modo no se apagaba correctamente y la línea oblicua daba problemas. Arreglado.}
% \changes{v2.72}{2016/05/16}{Las macros internas \cs{@DescripcionAuxCmd} y \cs{@EscribeTipoDeImpuesto} fueron modificadas.}
% \changes{v2.72}{2016/05/16}{Arreglada la alineación a la derecha en algunos casos en los precios.}
-% \changes{v2.72}{2016/05/16}{Se incluyó dentro de \cs{\@ITEM} la opción para soportar \cs{ItemX}.}
+% \changes{v2.72}{2016/05/16}{Se incluyó dentro de la macro interna \cs{@ITEM} la opción para soportar \cs{ItemX}.}
% \changes{v2.72}{2016/05/16}{Ahora se procesa el entorno de la factura aún cuando se pide sólo el reporte, para poder tomar las referencias y los totales. Para eso se cambiaron de sitio varias macros internas.}
% \changes{v2.72}{2016/05/16}{Agregadas las etiquetas y las referencias.}
+% \changes{v2.82}{2016/06/25}{Agregada la opción \texttt{numitem} para enumerar cada ítem en la factura.}
+% \changes{v2.82}{2016/06/25}{Corregido problema de etiquetas repetidas introducido en la versió 2.72.}
+% \changes{v2.82}{2016/06/25}{Corregida la alineación vertical entre las distintas columnas agregando \texttt{[t]} al abrir los ``{\slshape parboxes}'' en los comandos auxiliares que ponen cada celda en un {\slshape parbox} del tamaño de la celda más grande, porque si no se centra verticalmente la celda y se desalinea respecto a la columna de al lado.}
+% \changes{v2.82}{2016/06/25}{Ahora dentro de la definición de \cs{@CaracterCeldasVacias} está el código que centra el texto, para poder usar comandos que llenen la caja completa como \cs{dotfill}.}
+% \changes{v2.82}{2016/06/25}{Reimplementada la línea diagonal para que funcione en todos los casos.}
+% \changes{v2.82}{2016/06/25}{Nueva macro interna \cs{@ColumnasMultiColumnTotalesAuxCmd} para hacer más general la colocación de los totales en el modo de columnas dentro de un \cs{multicolumn}.}
+% \changes{v2.82}{2016/06/25}{Quitado el paquete \texttt{MnSymbol} en favor del comando \cs{flechaCR} para la flecha que indica que la descripción ocupa más de una línea.}
%
% \DoNotIndex{}
%
@@ -526,6 +537,9 @@
% \DescribeOption{impdesc}
% Con esta opción, la letra que indica la denominación del impuesto aplicado a cada elemento, en lugar de escribirse en el precio unitario y en el total, que es la forma predeterminada, sale escrito al final de la descripción. Puede preferirse de esta forma, y ahorra un poco de espacio usable en la descripción porque ya no sale en dos lugares dicha letra sino en uno solo.
%
+% \DescribeOption{numitem}
+% Con la opción |numitem| una nueva columna aparece en el cuadro de la factura donde se enumera cada ítem en el órden en el que se escriben dentro del entorno para la factura. Esto es útil por ejemplo cuando se hace referencia al número del ítem con el comando |\itemref|. Véase la sección \ref{sec:etiquetas}.
+%
% \DescribeOption{sincantidad}
% El ambiente |factura| tiene también la posibilidad de no mostrar el campo de la cantidad, ni aceptarlo como argumento de cada ítem; en ese caso los comandos |\Item| -de los que hablaremos en la sección \ref{sec:factura}- aceptan como argumentos solamente la descripción del elemento y su precio, en ese orden.
%
@@ -1085,7 +1099,7 @@
%
% }
%
-% \section{Etiquetas y referencias}
+% \section{Etiquetas y referencias\label{sec:etiquetas}}
%
% Esta clase |factura| soporta agregar etiquetas a cada elemento de la factura que luego en la descripción larga o en el reporte queramos referenciar.
%
@@ -1117,20 +1131,20 @@
%
% Los comandos anteriores son para usarse donde queramos hacer la cita, es decir, en la descripción larga o en el reporte.
%
-% Si se quiere mostrar el número que ocupa el ítem en la lista, lo hacemos con |\itemref|, que en el ejemplo aparecería el número ``|2|'' indicando que es el segundo ítem de la factura. Con |\cantref| escribimos la cantidad del elemento citado mediante la etiqueta, en nuestro ejemplo sería ``|3|''. Para la descripción del ítem usamos |\descref|, que en el caso del ejemplo sería el texto ``|Otro artículo gravado con IVA general|''. Para el precio unitario usamos |\puref|; en el ejemplo ``|1.500,00|''. Si se quiere mostrar el descuento del ítem citado usamos |\dctoref|, que para el ejemplo sería ``|0|''. Por último, para mostar el precio total usamos |\ptref|, y en nuestro ejemplo eso escribiría ``|4.500,00|''.
+% Si se quiere mostrar el número de fila que ocupa el ítem en la lista lo hacemos con |\itemref|, que en el ejemplo aparecería el número ``|2|'' indicando que es el segundo ítem de la factura\footnote{Cuando se usa \cs{itemref} conviene enumerar los ítems en la factura con la opción \texttt{numitem}.}. Con |\cantref| escribimos la cantidad del elemento citado mediante la etiqueta, en nuestro ejemplo sería ``|3|''. Para la descripción del ítem usamos |\descref|, que en el caso del ejemplo sería el texto ``|Otro artículo gravado con IVA general|''. Para el precio unitario usamos |\puref|, en el ejemplo ``|1.500,00|''. Si se quiere mostrar el descuento del ítem citado usamos |\dctoref|, que para el ejemplo sería ``|0|''. Por último, para mostrar el precio total usamos |\ptref|, y en nuestro ejemplo eso escribiría ``|4.500,00|''.
%
-% Podemos ver que el uso de los comandos |\puref| y |\ptref| nos muestran el precio en el mismo formato con el que lo vemos en la presentación de la factura, en cuanto al redondeo y al separador de miles y decimal.
+% Podemos ver que el uso de los comandos |\puref| y |\ptref| nos muestra el precio en el mismo formato con el que lo vemos en la presentación de la factura, en cuanto al redondeo y al separador de miles y decimal.
%
% Con la asignación de estas etiquetas y su uso mediante las referencias podemos de manera conveniente citar cualquier ítem que se haya facturado, de manera dinámica sin tener que reescribir en la descripción larga o en el reporte aquello que ya se escribió en el cuadro de la factura.
%
-% Por otra parte, también podemos en la descripción larga y en el resumen referirnos al signo monetario con el comando |\Moneda|, y a cualquiera de los totales de la siguiente forma:
+% Por otra parte, también podemos en la descripción larga y en el reporte referirnos al signo monetario con el comando |\Moneda|, y a cualquiera de los totales de la siguiente forma:
%
% \begin{tabular}{rl}
% \hline
% Total & Comando \\ \hline
-% Bases imponibles & |\BIG|, |\BIE|, |\BIR|, |\BIA| \\
+% Bases imponibles & |\BIG|, |\BIR|, |\BIA|, |\BIE|\footnote{Lo llamamos \cs{BIE} para mantener la nomenclatura pero no es una base imponible ya que es un monto exento de impuesto.} \\
% IVA & |\AlicuotaG|, |\AlicuotaR|, |\AlicuotaA| \\
-% Subtotales\footnote{El subtotal es el monto sin aplicar el descuento, que coincide con la base imponible cuando no hay descuento.} & |\SubtG|, |\SubtE|, |\SubtR|, |\SubtA| \\
+% Subtotales\footnote{El subtotal es el monto sin aplicar descuentos generales (los que se hacen con los comandos \cs{Descuento***}, es decir, los descuentos que no son individuales a cada item sino al totalizar), que coincide con la base imponible cuando no hay esos descuentos.} & |\SubtG|, |\SubtE|, |\SubtR|, |\SubtA| \\
% Descuentos & |\DescG|, |\DescE|, |\DescR|, |\DescA| \\
% Total final & |\Total|
% \end{tabular}
@@ -1205,6 +1219,7 @@
% todosiva & Expresa todos los tipos de IVA. \\
% G & Agrega una ``|G|'' en los ítems con IVA general. \\
% impdesc & Escribe la denominación del IVA en la descripción. \\
+% numitem & Enumera los ítems en la factura en otra columna extra a la izquierda. \\
% denom & Explicita la denominación del documento. \\
% sinnumero & No pone el número cuando se usa |denom|. \\
% sincantidad & Los artículos van sin expresar su cantidad. \\
@@ -1325,6 +1340,9 @@
\newif\if at sinnumero
\newif\if at conlineasha
\newif\if at linea
+\newif\if at lineacompleta
+\newif\if at lineahastatotal
+\newif\if at lineadesdeinicio
\newif\if at G
\newif\if at BIR
\newif\if at BIA
@@ -1363,17 +1381,10 @@
\newbool{SinLineasHoriExt}
\newbool{DCU}
\newbool{DUC}
-\newbool{PrimeroDesc}
+\newbool{NumItem}
+\newbool{PrimeroDescrip}
\newbool{ExpAbajo}\booltrue{ExpAbajo}
-%% Condicionales auxiliares para hacer que la línea oblicua salga donde corresponde.
-\newbool{LineaDesdeColUno}
-\newbool{LineaDesdeColDos}
-\newbool{LineaHastaColUno}
-\newbool{LineaHastaColDos}
-\newbool{LineaHastaFinal}
-\newbool{LineaHastaTotal}
-
%% Condicionales auxiliares para la posición de los objetos fijos cuando son medidos desde la derecha, o desde abajo.
\newbool{FechaXnegativo}
\newbool{FechaYnegativo}
@@ -1409,18 +1420,19 @@
\@agrupadotrue
\fi}
\DeclareOption{impdesc}{\@impdesctrue}% Para el tipo de impuesto en la descripción y no en el precio unitario y total.
+\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{PrimeroDesc}}
+ \booltrue{PrimeroDescrip}}
\DeclareOption{duc}{% Descripción, luego precio unitario y luego cantidad.
\if at dcu
\ClassWarning{factura}{Las opciones 'duc' y 'dcu' no son compatibles. Sin efecto ambas opciones}{}
- \boolfalse{PrimeroDesc}\boolfalse{DCU}\@dcufalse\@cdutrue
+ \boolfalse{PrimeroDescrip}\boolfalse{DCU}\@dcufalse\@cdutrue
\else
\@ductrue\@cdufalse\@dcufalse
\booltrue{DUC}\boolfalse{DCU}
- \booltrue{PrimeroDesc}
+ \booltrue{PrimeroDescrip}
\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.
@@ -1436,11 +1448,11 @@
\booltrue{SinCantidad}
\if at dcu
\ClassWarning{factura}{La opción 'sincantidad' no es compatible con 'dcu' . Sin efecto opción 'dcu'}{}
- \@dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDesc}
+ \@dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDescrip}
\fi
\if at duc
\ClassWarning{factura}{La opción 'sincantidad' no es compatible con 'duc' . Sin efecto opción 'duc'}{}
- \@ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDesc}
+ \@ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDescrip}
\fi}
\DeclareOption{conlineasha}{\@conlineashatrue}% Una línea horizontal para cada ítem, como las facturas a mano.
@@ -1487,7 +1499,6 @@
\RequirePackage{tabularx}% Con 'tabularx' hacemos la tabla.
\RequirePackage{environ}% Con 'environ' podemos usar tabularx dentro del ambiente de la factura y escribir texto en el enddef.
\RequirePackage{fancyhdr}% Las cabeceras fancy; así se use solamente en reporte, hay que cargarlo siempre.
-\RequirePackage{MnSymbol}% Para el símbolo $\lcurvearrowsw$ cuando la descripción ocupa más de una línea.
\AtBeginDocument{% Da error si algún campo necesario no está definido.
\if at reporte
@@ -1586,6 +1597,7 @@
%% Macros que guardan textos que corresponden a nombres de campos:
\def\@@Fecha{Fecha de emisi\'on:}
\def\@@RazonSocial{Raz\'on social:}
+\def\@@NumItem{\#}
\def\@@Cantidad{Cantidad}
\def\@@Descripcion{Descripci\'on}
\def\@@PrecioU{Precio U.}
@@ -1627,13 +1639,20 @@
%% i) carácter para separar el teléfono del e-mail del cliente,
%% ii) carácter para los campos vacíos cuando se usa \ItemX,
-%% iii) carácter para las celdas vacíos cuando la descripción del ítem ocupa más que una línea.
+%% iii) carácter para las celdas vacías cuando la descripción del ítem ocupa más que una línea.
%% iv) carácter de retorno de carro en el cuadro de la factura,
\def\@CaracterSeparaTelefonoEmail{$\diamond$}
\def\@CaracterItemXVacio{...}
-\def\@CaracterCeldasVacias{$\cdot$}
-\def\@CaracterCR{$\lcurvearrowsw\!$}% (del paquete MnSymbol)
-%% \def\@CaracterCR{$\hookleftarrow$}% también puede usarse este.
+\def\@CaracterCeldasVacias{\mbox{}\hfill$\cdot$\hfill\mbox{}}
+\def\@CaracterCR{\flechaCR}
+% \def\@CaracterCR{$\hookleftarrow$}
+% \def\@CaracterCR{$\cwrightarcarrow$}% Usando el paquete 'fnsymbol'.
+% \def\@CaracterCR{$\cwsearcarrow$}% Usando el paquete 'fnsymbol'.
+\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}}}
%% Separación entre la última letra y el carácter que indica que se continúa en la línea siguiente en la descripción cuando ocupa más de una línea. No vale la pena hacer una macro para cambiar esto.
\setlength{\@SeparaFinLineaDesc}{0.05cm}
@@ -1731,7 +1750,7 @@
\def\PosFecha#1#2{%
\IfBeginWith{#1}{-}
{\StrBehind{#1}{-}[\templeng]\setlength{\@PosFechaX}{-\templeng}\booltrue{FechaXnegativo}}
- {\boolfalse{FechaXnegativo}\setlength{\@PosFechaX}{#1}}%
+ {\boolfalse{FechaXnegativo}\setlength{\@PosFechaX}{#1}}
\IfBeginWith{#2}{-}
{\StrBehind{#2}{-}[\templeng]\setlength{\@PosFechaY}{-\templeng}\booltrue{FechaYnegativo}}
{\boolfalse{FechaYnegativo}\setlength{\@PosFechaY}{#2}}}
@@ -1742,7 +1761,7 @@
\def\PosDenom#1#2{%
\IfBeginWith{#1}{-}
{\StrBehind{#1}{-}[\templeng]\setlength{\@PosDenomX}{-\templeng}\booltrue{DenomXnegativo}}
- {\boolfalse{DenomXnegativo}\setlength{\@PosDenomX}{#1}}%
+ {\boolfalse{DenomXnegativo}\setlength{\@PosDenomX}{#1}}
\IfBeginWith{#2}{-}
{\StrBehind{#2}{-}[\templeng]\setlength{\@PosDenomY}{-\templeng}\booltrue{DenomYnegativo}}
{\boolfalse{DenomYnegativo}\setlength{\@PosDenomY}{#2}}}
@@ -1753,7 +1772,7 @@
\def\PosControl#1#2{%
\IfBeginWith{#1}{-}
{\StrBehind{#1}{-}[\templeng]\setlength{\@PosControlX}{-\templeng}\booltrue{ControlXnegativo}}
- {\boolfalse{ControlXnegativo}\setlength{\@PosControlX}{#1}}%
+ {\boolfalse{ControlXnegativo}\setlength{\@PosControlX}{#1}}
\IfBeginWith{#2}{-}
{\StrBehind{#2}{-}[\templeng]\setlength{\@PosControlY}{-\templeng}\booltrue{ControlYnegativo}}
{\boolfalse{ControlYnegativo}\setlength{\@PosControlY}{#2}}}
@@ -1903,10 +1922,10 @@
%% 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}%
+ \RequirePackage{graphicx}
\ifx&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi
\ifx&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi
- \savebox{\@CajaFirmaEmisor}{#1}%
+ \savebox{\@CajaFirmaEmisor}{#1}
\if at reporte
\expandafter\AtBeginShipoutNext
\else
@@ -1964,30 +1983,30 @@
\end{textblock*}
\fi}
-%% 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]{%
+%% 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}%
+ \RequirePackage{graphicx}
\@fondofacturatrue
- \gdef\@FondoFactura{#1}%
+ \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}{%
+\NewDocumentCommand{\FondoReporte}{s m}{
\if at reporte
\@fondoreportetrue
- \RequirePackage{graphicx}%
- \gdef\@FondoReporte{#2}%
+ \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}{%
+\NewDocumentCommand{\EstiloPagReporte}{o m}{
\gdef\@EstiloPagReporteResto{#2}
\IfValueTF{#1}{\gdef\@EstiloPagReporteUno{#1}}{\gdef\@EstiloPagReporteUno{\@EstiloPagReporteResto}}}
%% El título para el reporte.
-\NewDocumentCommand{\TituloReporte}{s m}{%
+\NewDocumentCommand{\TituloReporte}{s m}{
\gdef\@TituloReporte{#2}%
\IfBooleanTF{#1}{% Con '*' sale el título en las cabeceras o piés. Sin '*' no.
\gdef\@InfoPagina{\let\\\relax\@InfoPaginaTitulo}}%
@@ -1995,8 +2014,8 @@
%% Para cada cliente o para cada personalización se puede tener un archivo .def o .tex con su nombre y ciertas macros cargadas. Ese archivo lo ponemos incluir con '\Cliente' en lugar de usar \input, y la extensión deberá ser .def o .tex.
\newcommand{\Cliente}[1]{%
- \IfFileExists{#1.def}{\input{#1.def}}{%
- \IfFileExists{#1.tex}{\input{#1.tex}}{%
+ \IfFileExists{#1.def}{\input{#1.def}}{
+ \IfFileExists{#1.tex}{\input{#1.tex}}{
\ClassError{factura}{** No existe #1.def ni #1.tex **}{}}}}
%% Comando para mostrar macros con '@'.
@@ -2007,7 +2026,9 @@
\newlength{\@TamResumen}
\newlength{\@TamFinalEncabez}
\newlength{\@TamLineaFirmas}
+\newlength{\@TamNumItem}
\newlength{\@TamCantidad}
+\newlength{\@TamDescrip}
\newlength{\@TamPrecioU}
\newlength{\@TamDescuento}
\newlength{\@TamPrecioT}
@@ -2068,7 +2089,7 @@
%% Contadores para uso interno para uso interno:
\newcounter{@IVANoGeneral}% '0' con sólo IVA G, '1' cuando hay IVA R o IVA A, y '2' cuando hay ambos.
-\newcounter{@NumItem}% Número del ítem actual, para uso de algunas macros en el cuadro de la factura.
+\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'.
\input{factura.def}% Cargamos los valores predeterminados.
@@ -2091,7 +2112,7 @@
\fi
\if at exparriba
- \RequirePackage{zref-savepos}% Para guardar la posición en 'Y'.
+ \RequirePackage{zref-savepos}[2016/05/21]% Para guardar la posición en 'Y'.
\fi
\if at reporte
@@ -2130,6 +2151,7 @@
%% 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]{%
+ \immediate\write\@auxout{\gdef\noexpand\@TamDescrip{\the\linewidth}}% Para poder establecer la línea diagonal hay que saber el tamaño del campo de la descripción.
\setbox0\hbox{\parbox[t]{\linewidth}{#1%
\if at impdesc\hfill\ \@EscribeTipoDeImpuesto{#2}\fi%
\par\global\count1=\prevgraf}}%
@@ -2160,25 +2182,30 @@
\fi}
%% Comandos auxiliares para colocar en \parbox cada celda.
+\newcommand{\@NumItemAuxCmd}[1]{%
+ \savebox{\@CajaPrueba}{#1}%
+ \ifdim\wd\@CajaPrueba > \@TamNumItem \global\@TamNumItem=\wd\@CajaPrueba\fi
+ \parbox[t]{\@TamNumItem}{#1}}
+
\newcommand{\@CantidadAuxCmd}[1]{%
\savebox{\@CajaPrueba}{#1}%
\ifdim\wd\@CajaPrueba > \@TamCantidad \global\@TamCantidad=\wd\@CajaPrueba\fi
- \parbox{\@TamCantidad}{#1}}
+ \parbox[t]{\@TamCantidad}{#1}}
\newcommand{\@PrecioUAuxCmd}[1]{%
\savebox{\@CajaPrueba}{#1}%
\ifdim\wd\@CajaPrueba > \@TamPrecioU \global\@TamPrecioU=\wd\@CajaPrueba\fi
- \parbox{\@TamPrecioU}{#1}}
+ \parbox[t]{\@TamPrecioU}{#1}}
\newcommand{\@DescuentoAuxCmd}[1]{%
\savebox{\@CajaPrueba}{#1}%
\ifdim\wd\@CajaPrueba > \@TamDescuento \global\@TamDescuento=\wd\@CajaPrueba\fi
- \parbox{\@TamDescuento}{#1}}
+ \parbox[t]{\@TamDescuento}{#1}}
\newcommand{\@PrecioTAuxCmd}[1]{%
\savebox{\@CajaPrueba}{#1}%
\ifdim\wd\@CajaPrueba > \@TamPrecioT \global\@TamPrecioT=\wd\@CajaPrueba\fi
- \parbox{\@TamPrecioT}{#1}}
+ \parbox[t]{\@TamPrecioT}{#1}}
%% Presentación de totales en modo de columnas.
\newcommand{\@EscribeTotalCol}[1]{%
@@ -2342,11 +2369,6 @@
\if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
\if at centrado\hspace*{\@SepTotales}\fi}
-%% Comando que guarda la posición en X para el nodo A de la línea.
-\newcommand{\@LineaNodoACoordX}{\hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}}
-%% Comando que guarda la posición en X para el nodo B de la línea.
-\newcommand{\@LineaNodoBCoordX}{\hspace*{-\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{\tabcolsep}}
-
%% 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.
@@ -2403,34 +2425,47 @@
%% Comandos auxiliares para poder evaluar la definición de las columnas en la tabla con un comando que se expande completamente.
\def\@FacturaAuxColumnasEval{
- % Primera línea.
+ % Primera línea, la más externa.
\ifbool{SinLineasVertExt}{}{|}
+ % Columna para el número del ítem, si aplica.
+ \ifbool{NumItem}{c}{r@{\extracolsep{0pt}}}
+ % Segunda línea, que sale solamente cuando se usa la opción 'numitem'
+ \ifbool{NumItem}{\ifbool{SinLineasVertInt}{}{|}}{}
% Columna 'X' con DCU, columna fantasma con 'sincantidad' y columna 'c' con CDU.
- \ifbool{PrimeroDesc}{X}{
+ \ifbool{PrimeroDescrip}{X}{
\ifbool{SinCantidad}{l@{\extracolsep{0pt}}}{c}}
- % Segunda línea.
+ % Tercera línea.
\ifbool{SinCantidad}{}{\ifbool{SinLineasVertInt}{}{|}}
% Columna 'c' con DCU, columna 'r' con DUC, columna 'X' sin espacio para 'sincantidad' y columna 'X' con CDU.
\ifbool{DCU}{c}{
\ifbool{DUC}{r}{
\ifbool{SinCantidad}{X@{\extracolsep{0pt}}}{X}}}
- % Tercera línea, que sale solamente cuando no se usa 'sincantidad'.
+ % Cuarta línea, que sale solamente cuando no se usa 'sincantidad'.
\ifbool{SinCantidad}{}{\ifbool{SinLineasVertInt}{}{|}}
% Columna 'c' para DUC y columna 'r' para cualquier otro caso (DCU, CDU y 'sincantidad').
\ifbool{DUC}{c}{r}
- % Cuarta línea.
+ % Quinta línea.
\ifbool{SinLineasVertInt}{}{|}
% Columna 'c' para 'descuentos' y columna 'r' sin espacio si no hay descuentos individuales.
\ifbool{Descuentos}{c}{r@{\extracolsep{0pt}}}
- % Quinta línea, que sale solamente cuando hay descuentos.
+ % Sexta línea, que sale solamente cuando hay descuentos.
\ifbool{Descuentos}{\ifbool{SinLineasVertInt}{}{|}}{}
% Columna 'r' siempre.
r
- % Sexta y última línea.
+ % Séptima 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{6}{\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 para hacer los cálculos sobre cada ítem y establecer las macros con el contenido de cada ítem introducido.
\newcommand{\@CalculaItem}[5]{%
\addtocounter{@NumItem}{1}%
@@ -2453,7 +2488,7 @@
% Macro interna para saber si una etiqueta existe o no.
\gdef\@pruebaref#1{%
- \expandafter\ifx\csname @Etiqueta@@#1\endcsname\relax
+ \expandafter\ifx\csname @Etiqueta@#1\endcsname\relax
\ClassWarning{factura}{La etiqueta `#1' no está definida}{}\ignorespaces
\@pruebareffalse
\else
@@ -2461,20 +2496,24 @@
\fi}
% Comandos para las referencias: i) referencia al número de ítem, ii) a la cantidad, iii) a la descripción, iv) al precio unitario, v) al descuento, vi) al precio total.
-\gdef\itemref#1{\@pruebaref{#1}\if at pruebaref \csname @Etiqueta@@#1\endcsname \fi}
-\gdef\cantref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Cantidad\endcsname \fi}
-\gdef\descref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Descripcion\endcsname \fi}
-\gdef\puref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @PrecioU\endcsname \fi}
-\gdef\dctoref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Descuento\endcsname \fi}
-\gdef\ptref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @PrecioT\endcsname \fi}
+\gdef\itemref#1{%
+ \ifbool{NumItem}{}{\ClassWarning{factura}{Es recomendable usar la opción 'numitem' para enumerar los ítems}{}}%
+ \@pruebaref{#1}\if at pruebaref \csname @Etiqueta@#1\endcsname \fi}
+\gdef\cantref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Cantidad\endcsname \fi}
+\gdef\descref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Descripcion\endcsname \fi}
+\gdef\puref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioU\endcsname \fi}
+\gdef\dctoref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Descuento\endcsname \fi}
+\gdef\ptref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioT\endcsname \fi}
% Definimos un comando para la etiqueta, que se define dentro del entorno de la factura para que tenga alcance local; cuando se acaba dicho entorno, el comando \label vuelve a ser lo que está definido en latex.ltx.
\newcommand{\label at factura}[1]{%
- \expandafter\ifx\csname @Etiqueta@@#1\endcsname\relax
- \expandafter\global\expandafter\edef\csname @Etiqueta@@#1\endcsname{\arabic{@NumItem}}\ignorespaces
+ \expandafter\ifx\csname @Etiqueta@#1\endcsname\relax
+ \expandafter\global\expandafter\edef\csname @Etiqueta@#1\endcsname{\arabic{@NumItem}}\ignorespaces
+ \ClassInfo{factura}{Etiqueta `#1' definida para el ítem \arabic{@NumItem}}{}%
\else
- \expandafter\if\csname @Etiqueta@@#1\endcsname\the at NumItem
- \ClassInfo{factura}{Etiqueta `#1' definida para el ítem \arabic{@NumItem}}{}%
+ \edef\@label at test@uno{\csname @Etiqueta@#1\endcsname}%
+ \edef\@label at test@dos{\the at NumItem}%
+ \ifx\@label at test@uno\@label at test@dos
\else
\ClassWarning{factura}{La etiqueta `#1' se definió más de una vez}{}\ignorespaces
\fi
@@ -2487,9 +2526,20 @@
\setlength{\@EspacioVacioFinal}{\zposy{EspacioVacioFinal}sp}%
\global\@EspacioVacioInicial=\@EspacioVacioInicial% ¿por qué tendré que globalizarlas?
\global\@EspacioVacioFinal=\@EspacioVacioFinal
- \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{1pt}{\mbox{}}}%
+ \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{\@TamDescrip}{%
+ \if at linea
+ \if at lineacompleta
+ \zsaveposy{LineaNodoBCoordY}%
+ \else
+ \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{factura}{** 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.
@@ -2512,7 +2562,7 @@
\advance\dimen at -\baselineskip
\settowidth{\@TempDimen}{##3}%
\ifdim\@TempDimen=0pt\settowidth{\@TempDimen}{##2}\fi
- \hbox{\parbox{\@TempDimen}{\mbox{}\hfill\@CaracterCeldasVacias\hfill\mbox{}}}%
+ \hbox{\parbox{\@TempDimen}{\@CaracterCeldasVacias}}%
\repeat
\fi
##3}}%
@@ -2531,14 +2581,17 @@
\\
\if at conlineasha\hline\fi% Líneas para separar cada ítem, si hiciera falta.
\fi
- % Primer campo: Acá puede ir la cantidad (cdu) o la descripción (dcu y duc).
+ % 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{PrimeroDesc}
+ \ifbool{PrimeroDescrip}
{\@DescripcionAuxCmd{##3}{##1}}% dcu y duc.
{\David at XLeft{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}}}% cdu.
&
- % Segundo campo: Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc).
- \ifbool{PrimeroDesc}{%
+ % Tercer campo: Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc).
+ \ifbool{PrimeroDescrip}{%
\if at dcu
\David at XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu.
\else
@@ -2550,7 +2603,7 @@
\fi}
{\@DescripcionAuxCmd{##3}{##1}}% cdu.
&
- % Tercer campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc).
+ % Cuarto campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc).
\FPifeq\PrecioU{##4}\else\ClassWarning{factura}{** Se está introduciendo un precio con más de dos decimales: (##3 - ##4. Redondeado a \PrecioU) **}{}\fi% Advertimos cuando el precio unitario tiene más de dos decimales.
\ifbool{SinCantidad}{}{%
\if at duc
@@ -2563,15 +2616,15 @@
\fi}}% dcu y cdu.
\fi}%
&
- % Cuarto campo: Descuento.
+ % Quinto -opcional- campo: Descuento.
\ifbool{Descuentos}{%
\David at XRight{\@DescuentoAuxCmd{%
\ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
\else
- \mbox{}\hfill \@LetraNumeros \numprint{\Dcto}\%\hfill\mbox{}
+ \mbox{}\hfill \@LetraNumeros \numprint{\Dcto}\%\hfill\mbox{}%
\fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq.
&
- % Quinto campo: El total.
+ % Sexto campo: El total.
\David at XRight{\@PrecioTAuxCmd{%
\ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
\else
@@ -2614,20 +2667,20 @@
\@FacturaAuxInicioCmd
\ifbool{SinLineasHoriExt}{}{\hline}%
\@ZERO
- % Estamos en la cantidad, o la descripción.
- \ifbool{LineaDesdeColUno}{\@LineaNodoACoordX}{}%
- \ifbool{SinCantidad}{}{\ifbool{PrimeroDesc}{\@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}}}%
+ % Estamos en el número del ítem, si aplicara.
+ \if at lineadesdeinicio \hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}\fi
+ \ifbool{NumItem}{\@NumItemAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@NumItem \hfill\mbox{}}}{}%
+ &
+ % Avanzamos a la cantidad, o la descripción.
+ \ifbool{SinCantidad}{}{\ifbool{PrimeroDescrip}{\@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}}}%
&% Avanzamos hasta la descripción, la cantidad o el precio unitario.
- \ifbool{LineaDesdeColDos}{\@LineaNodoACoordX}{}%
- \ifbool{LineaHastaColUno}{\hspace*{-\arrayrulewidth}\@LineaNodoBCoordX\hspace*{\arrayrulewidth}}{}%
\ifbool{SinCantidad}{\@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}}
{\if at cdu \@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}\fi
\if at dcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}\fi
\if at duc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@PrecioU \space (\Moneda)\hfill\mbox{}}\fi}%
&% Avanzamos hasta el precio unitario, o la cantidad, o columna fantasma cuando es 'sincantidad'.
- \ifbool{SinCantidad}{%
- \ifbool{LineaHastaColDos}{\hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}}{}}%
- {\ifbool{LineaHastaColDos}{\hspace*{-\arrayrulewidth}\@LineaNodoBCoordX\hspace*{\arrayrulewidth}}{}%
+ \ifbool{SinCantidad}{}
+ {%
\mbox{}\hfill
\if at duc
\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}%
@@ -2638,7 +2691,7 @@
\if at descuentos \@DescuentoAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Descuento \hfill\mbox{}}\fi
&% Avanzamos hasta el precio total.
\@PrecioTAuxCmd{\mbox{}\hfill \@LetraTitCuadro \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\Moneda)\hfill\mbox{}}%
- \ifbool{LineaHastaFinal}{\hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}}{}%
+ \if at lineacompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi
\\
\ifbool{SinLineasHoriInt}{}{\hline}%
%
@@ -2650,9 +2703,7 @@
\ifdim \ht\@CajaEspacioVacio=0pt
\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.
\else
- &\usebox{\@CajaEspacioVacio}%
- \if at linea\mbox{}\zsaveposy{LineaNodoBCoordY}\fi% Se guarda la coordenada Y del punto de la derecha de la línea diagonal. Tiene que haber \mbox{}.
- &&&\\
+ \ifbool{PrimeroDescrip}{&\usebox{\@CajaEspacioVacio}&&&&\\}{&&\usebox{\@CajaEspacioVacio}&&&\\}%
\ifbool{SinLineasHoriExt}{}{\hline}% Siempre que hay relleno se pone la línea acá.
\fi
\else
@@ -2661,16 +2712,10 @@
\ifdim \ht\@CajaEspacioVacio=0pt
\else
% Rellenamos la tabla con espacio espúreo, y le agregamos las lineas externas, si aplica.
- \ifbool{SinLineasVertExt}{\multicolumn{5}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{5}{|c|}{\usebox{\@CajaEspacioVacio}}}\\
+ \ifbool{SinLineasVertExt}{\multicolumn{6}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{6}{|c|}{\usebox{\@CajaEspacioVacio}}}\\
\fi
- % Abrimos la tabla para escribir los totales, y le agregamos las líneas verticales externas, si aplica.
- \ifbool{SinLineasVertExt}
- {\multicolumn{5}{r}\begingroup
- \ifdim \ht\@CajaEspacioVacio=0pt \else \if at linea\zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}\fi\fi
- \begin{tabular}[b]{@{\extracolsep{2\tabcolsep}}lr}}
- {\multicolumn{5}{|r}\begingroup
- \ifdim \ht\@CajaEspacioVacio=0pt \else \if at linea\zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}\fi\fi
- \begin{tabular}[b]{@{\extracolsep{2\tabcolsep}}lr|}}% Una vaina loca... tuve que meter también el tabular con la línea '|' porque no pude poner esa línea en el multicolumn.
+ % 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
@@ -2869,14 +2914,9 @@
\RequirePackage{eso-pic}% Para poder 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}
- {\booltrue{LineaDesdeColUno}\booltrue{LineaHastaFinal}}
- {\ifbool{PrimeroDesc}
- {\booltrue{LineaDesdeColUno}\booltrue{LineaHastaColUno}}
- {\booltrue{LineaDesdeColDos}\booltrue{LineaHastaColDos}}}
+ \ifbool{SinLineasVertInt}{\@lineacompletatrue}
\else
- \ifbool{SinCantidad}{\booltrue{LineaDesdeColDos}}{\booltrue{LineaDesdeColUno}}
- \booltrue{LineaHastaTotal}
+ \@lineahastatotaltrue\@lineadesdeiniciotrue
\fi
\fi
@@ -2904,7 +2944,7 @@
\let\@ITEM\@CalculaItem
\BODY
\@CalculaTotalesI}
- \NewDocumentCommand{\Descripcion}{s +m}{}
+ \NewDocumentCommand{\Descripcion}{+m}{}
\fi
\if at reporte
@@ -3274,6 +3314,7 @@
%<reptres>%% El reporte se imprime en las dos caras del papel (twoside),
%
%<factcinco>%% Cuadro de la factura sin la columna de cantidades (sincantidad),
+%<factdos|factseis>%% Con la columna para enumerar los ítems (numitem),
%<factdos>%% Con descuentos individuales (descuentos),
%
%<facttres>%% Agrupados los totales por gravámenes (agrupado),
@@ -3361,6 +3402,7 @@
%<beispiel>nospanish,
%<reptres>twoside,
%<factcinco>sincantidad,
+%<factdos|factseis>numitem,
%<factdos>descuentos,
%<factcuatro|factcinco|factsiete>filas,
%<factcinco>centrado,
@@ -3514,7 +3556,7 @@
%<!reptres>\begin{factura}
%<!factdos&!factcinco&!factseis&!repdos&!reptres&!beispiel> \Item{1}{ítem con IVA general}{1000}
%<factseis|repdos> \Item{2}{ítem con IVA general}{1000}\label{primeritem}
-%<factuno|factcuatro> \Item{4}{otro ítem con IVA general}{100}
+%<factuno|factcuatro|factseis|repdos> \Item{4}{otro ítem con IVA general}{100}
%<facttres|prefac> \ItemR{1}{ítem con IVA reducido}{1000}
%<facttres> \ItemA{1}{ítem con IVA adicional}{1000}
%<facttres> \ItemE{1}{ítem exento de impuesto}{1000}
@@ -3539,8 +3581,8 @@
%<repuno|repdos|reptres|factcinco|factocho>\begin{reporte}
%<repuno|repdos|reptres|factcinco|factocho> El reporte - página 1\newpage El reporte - página 2 \newpage El reporte - página 3.
%<repdos>
-%<factseis|repdos> Se facturaron \cantref{primeritem} \descref{primeritem} por un valor de \Moneda\puref{primeritem} cada uno, dando un total de \Moneda\ptref{primeritem}. El IVA es de \Moneda\AlicuotaG, y el total final es \Moneda\Total.
-%<factseis|repdos> % También podemos usar \itemref{primeritem}, \dctoref{primeritem}, y en cuanto a las totalizaciones: \BIE, \BIR, \BIA, \AlicuotaR, \AlicuotaA, \SubtG, \SubtE, \SubtR, \SubtA, \DescG, \DescE, \DescR, \DescA para los demás totales.
+%<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 total de \Moneda\ptref{primeritem}, el IVA de este ítem es de \Moneda\AlicuotaG; luego se facturó otro ítem dando un total final de \Moneda\Total.
+%<factseis|repdos> % También podemos usar \dctoref{primeritem} para la referencia al descuento, y en cuanto a las totalizaciones: \BIE, \BIR, \BIA, \AlicuotaR, \AlicuotaA, \SubtG, \SubtE, \SubtR, \SubtA, \DescG, \DescE, \DescR, \DescA para los demás totales.
%<factseis>}
%<repdos%<repdos|factcinco|factocho> \FirmaReporte[\includegraphics[width=5cm]{factura-ejemplo-firma}][0pt][21pt]
%<reptres> \vspace{1.5cm}\FirmaReporte
Modified: trunk/Master/texmf-dist/tex/latex/factura/factura.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/factura/factura.cls 2016-06-25 14:08:05 UTC (rev 41537)
+++ trunk/Master/texmf-dist/tex/latex/factura/factura.cls 2016-06-25 22:10:38 UTC (rev 41538)
@@ -36,7 +36,7 @@
%%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{factura}
-[2016/05/16 v2.72
+[2016/06/25 v2.82
Clase para elaborar facturas legales
en la República Bolivariana de Venezuela.
]
@@ -57,6 +57,9 @@
\newif\if at sinnumero
\newif\if at conlineasha
\newif\if at linea
+\newif\if at lineacompleta
+\newif\if at lineahastatotal
+\newif\if at lineadesdeinicio
\newif\if at G
\newif\if at BIR
\newif\if at BIA
@@ -95,17 +98,10 @@
\newbool{SinLineasHoriExt}
\newbool{DCU}
\newbool{DUC}
-\newbool{PrimeroDesc}
+\newbool{NumItem}
+\newbool{PrimeroDescrip}
\newbool{ExpAbajo}\booltrue{ExpAbajo}
-%% Condicionales auxiliares para hacer que la línea oblicua salga donde corresponde.
-\newbool{LineaDesdeColUno}
-\newbool{LineaDesdeColDos}
-\newbool{LineaHastaColUno}
-\newbool{LineaHastaColDos}
-\newbool{LineaHastaFinal}
-\newbool{LineaHastaTotal}
-
%% Condicionales auxiliares para la posición de los objetos fijos cuando son medidos desde la derecha, o desde abajo.
\newbool{FechaXnegativo}
\newbool{FechaYnegativo}
@@ -141,18 +137,19 @@
\@agrupadotrue
\fi}
\DeclareOption{impdesc}{\@impdesctrue}% Para el tipo de impuesto en la descripción y no en el precio unitario y total.
+\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{PrimeroDesc}}
+ \booltrue{PrimeroDescrip}}
\DeclareOption{duc}{% Descripción, luego precio unitario y luego cantidad.
\if at dcu
\ClassWarning{factura}{Las opciones 'duc' y 'dcu' no son compatibles. Sin efecto ambas opciones}{}
- \boolfalse{PrimeroDesc}\boolfalse{DCU}\@dcufalse\@cdutrue
+ \boolfalse{PrimeroDescrip}\boolfalse{DCU}\@dcufalse\@cdutrue
\else
\@ductrue\@cdufalse\@dcufalse
\booltrue{DUC}\boolfalse{DCU}
- \booltrue{PrimeroDesc}
+ \booltrue{PrimeroDescrip}
\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.
@@ -168,11 +165,11 @@
\booltrue{SinCantidad}
\if at dcu
\ClassWarning{factura}{La opción 'sincantidad' no es compatible con 'dcu' . Sin efecto opción 'dcu'}{}
- \@dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDesc}
+ \@dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDescrip}
\fi
\if at duc
\ClassWarning{factura}{La opción 'sincantidad' no es compatible con 'duc' . Sin efecto opción 'duc'}{}
- \@ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDesc}
+ \@ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDescrip}
\fi}
\DeclareOption{conlineasha}{\@conlineashatrue}% Una línea horizontal para cada ítem, como las facturas a mano.
@@ -219,7 +216,6 @@
\RequirePackage{tabularx}% Con 'tabularx' hacemos la tabla.
\RequirePackage{environ}% Con 'environ' podemos usar tabularx dentro del ambiente de la factura y escribir texto en el enddef.
\RequirePackage{fancyhdr}% Las cabeceras fancy; así se use solamente en reporte, hay que cargarlo siempre.
-\RequirePackage{MnSymbol}% Para el símbolo $\lcurvearrowsw$ cuando la descripción ocupa más de una línea.
\AtBeginDocument{% Da error si algún campo necesario no está definido.
\if at reporte
@@ -374,7 +370,7 @@
\def\PosFecha#1#2{%
\IfBeginWith{#1}{-}
{\StrBehind{#1}{-}[\templeng]\setlength{\@PosFechaX}{-\templeng}\booltrue{FechaXnegativo}}
- {\boolfalse{FechaXnegativo}\setlength{\@PosFechaX}{#1}}%
+ {\boolfalse{FechaXnegativo}\setlength{\@PosFechaX}{#1}}
\IfBeginWith{#2}{-}
{\StrBehind{#2}{-}[\templeng]\setlength{\@PosFechaY}{-\templeng}\booltrue{FechaYnegativo}}
{\boolfalse{FechaYnegativo}\setlength{\@PosFechaY}{#2}}}
@@ -382,7 +378,7 @@
\def\PosDenom#1#2{%
\IfBeginWith{#1}{-}
{\StrBehind{#1}{-}[\templeng]\setlength{\@PosDenomX}{-\templeng}\booltrue{DenomXnegativo}}
- {\boolfalse{DenomXnegativo}\setlength{\@PosDenomX}{#1}}%
+ {\boolfalse{DenomXnegativo}\setlength{\@PosDenomX}{#1}}
\IfBeginWith{#2}{-}
{\StrBehind{#2}{-}[\templeng]\setlength{\@PosDenomY}{-\templeng}\booltrue{DenomYnegativo}}
{\boolfalse{DenomYnegativo}\setlength{\@PosDenomY}{#2}}}
@@ -390,7 +386,7 @@
\def\PosControl#1#2{%
\IfBeginWith{#1}{-}
{\StrBehind{#1}{-}[\templeng]\setlength{\@PosControlX}{-\templeng}\booltrue{ControlXnegativo}}
- {\boolfalse{ControlXnegativo}\setlength{\@PosControlX}{#1}}%
+ {\boolfalse{ControlXnegativo}\setlength{\@PosControlX}{#1}}
\IfBeginWith{#2}{-}
{\StrBehind{#2}{-}[\templeng]\setlength{\@PosControlY}{-\templeng}\booltrue{ControlYnegativo}}
{\boolfalse{ControlYnegativo}\setlength{\@PosControlY}{#2}}}
@@ -500,10 +496,10 @@
%% 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}%
+ \RequirePackage{graphicx}
\ifx&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi
\ifx&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi
- \savebox{\@CajaFirmaEmisor}{#1}%
+ \savebox{\@CajaFirmaEmisor}{#1}
\if at reporte
\expandafter\AtBeginShipoutNext
\else
@@ -561,30 +557,30 @@
\end{textblock*}
\fi}
-%% 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]{%
+%% 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}%
+ \RequirePackage{graphicx}
\@fondofacturatrue
- \gdef\@FondoFactura{#1}%
+ \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}{%
+\NewDocumentCommand{\FondoReporte}{s m}{
\if at reporte
\@fondoreportetrue
- \RequirePackage{graphicx}%
- \gdef\@FondoReporte{#2}%
+ \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}{%
+\NewDocumentCommand{\EstiloPagReporte}{o m}{
\gdef\@EstiloPagReporteResto{#2}
\IfValueTF{#1}{\gdef\@EstiloPagReporteUno{#1}}{\gdef\@EstiloPagReporteUno{\@EstiloPagReporteResto}}}
%% El título para el reporte.
-\NewDocumentCommand{\TituloReporte}{s m}{%
+\NewDocumentCommand{\TituloReporte}{s m}{
\gdef\@TituloReporte{#2}%
\IfBooleanTF{#1}{% Con '*' sale el título en las cabeceras o piés. Sin '*' no.
\gdef\@InfoPagina{\let\\\relax\@InfoPaginaTitulo}}%
@@ -592,8 +588,8 @@
%% Para cada cliente o para cada personalización se puede tener un archivo .def o .tex con su nombre y ciertas macros cargadas. Ese archivo lo ponemos incluir con '\Cliente' en lugar de usar \input, y la extensión deberá ser .def o .tex.
\newcommand{\Cliente}[1]{%
- \IfFileExists{#1.def}{\input{#1.def}}{%
- \IfFileExists{#1.tex}{\input{#1.tex}}{%
+ \IfFileExists{#1.def}{\input{#1.def}}{
+ \IfFileExists{#1.tex}{\input{#1.tex}}{
\ClassError{factura}{** No existe #1.def ni #1.tex **}{}}}}
%% Comando para mostrar macros con '@'.
@@ -604,7 +600,9 @@
\newlength{\@TamResumen}
\newlength{\@TamFinalEncabez}
\newlength{\@TamLineaFirmas}
+\newlength{\@TamNumItem}
\newlength{\@TamCantidad}
+\newlength{\@TamDescrip}
\newlength{\@TamPrecioU}
\newlength{\@TamDescuento}
\newlength{\@TamPrecioT}
@@ -665,7 +663,7 @@
%% Contadores para uso interno para uso interno:
\newcounter{@IVANoGeneral}% '0' con sólo IVA G, '1' cuando hay IVA R o IVA A, y '2' cuando hay ambos.
-\newcounter{@NumItem}% Número del ítem actual, para uso de algunas macros en el cuadro de la factura.
+\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'.
\input{factura.def}% Cargamos los valores predeterminados.
@@ -688,7 +686,7 @@
\fi
\if at exparriba
- \RequirePackage{zref-savepos}% Para guardar la posición en 'Y'.
+ \RequirePackage{zref-savepos}[2016/05/21]% Para guardar la posición en 'Y'.
\fi
\if at reporte
@@ -727,6 +725,7 @@
%% 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]{%
+ \immediate\write\@auxout{\gdef\noexpand\@TamDescrip{\the\linewidth}}% Para poder establecer la línea diagonal hay que saber el tamaño del campo de la descripción.
\setbox0\hbox{\parbox[t]{\linewidth}{#1%
\if at impdesc\hfill\ \@EscribeTipoDeImpuesto{#2}\fi%
\par\global\count1=\prevgraf}}%
@@ -757,25 +756,30 @@
\fi}
%% Comandos auxiliares para colocar en \parbox cada celda.
+\newcommand{\@NumItemAuxCmd}[1]{%
+ \savebox{\@CajaPrueba}{#1}%
+ \ifdim\wd\@CajaPrueba > \@TamNumItem \global\@TamNumItem=\wd\@CajaPrueba\fi
+ \parbox[t]{\@TamNumItem}{#1}}
+
\newcommand{\@CantidadAuxCmd}[1]{%
\savebox{\@CajaPrueba}{#1}%
\ifdim\wd\@CajaPrueba > \@TamCantidad \global\@TamCantidad=\wd\@CajaPrueba\fi
- \parbox{\@TamCantidad}{#1}}
+ \parbox[t]{\@TamCantidad}{#1}}
\newcommand{\@PrecioUAuxCmd}[1]{%
\savebox{\@CajaPrueba}{#1}%
\ifdim\wd\@CajaPrueba > \@TamPrecioU \global\@TamPrecioU=\wd\@CajaPrueba\fi
- \parbox{\@TamPrecioU}{#1}}
+ \parbox[t]{\@TamPrecioU}{#1}}
\newcommand{\@DescuentoAuxCmd}[1]{%
\savebox{\@CajaPrueba}{#1}%
\ifdim\wd\@CajaPrueba > \@TamDescuento \global\@TamDescuento=\wd\@CajaPrueba\fi
- \parbox{\@TamDescuento}{#1}}
+ \parbox[t]{\@TamDescuento}{#1}}
\newcommand{\@PrecioTAuxCmd}[1]{%
\savebox{\@CajaPrueba}{#1}%
\ifdim\wd\@CajaPrueba > \@TamPrecioT \global\@TamPrecioT=\wd\@CajaPrueba\fi
- \parbox{\@TamPrecioT}{#1}}
+ \parbox[t]{\@TamPrecioT}{#1}}
%% Presentación de totales en modo de columnas.
\newcommand{\@EscribeTotalCol}[1]{%
@@ -939,11 +943,6 @@
\if at Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
\if at centrado\hspace*{\@SepTotales}\fi}
-%% Comando que guarda la posición en X para el nodo A de la línea.
-\newcommand{\@LineaNodoACoordX}{\hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}}
-%% Comando que guarda la posición en X para el nodo B de la línea.
-\newcommand{\@LineaNodoBCoordX}{\hspace*{-\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{\tabcolsep}}
-
%% 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.
@@ -1000,34 +999,47 @@
%% Comandos auxiliares para poder evaluar la definición de las columnas en la tabla con un comando que se expande completamente.
\def\@FacturaAuxColumnasEval{
- % Primera línea.
+ % Primera línea, la más externa.
\ifbool{SinLineasVertExt}{}{|}
+ % Columna para el número del ítem, si aplica.
+ \ifbool{NumItem}{c}{r@{\extracolsep{0pt}}}
+ % Segunda línea, que sale solamente cuando se usa la opción 'numitem'
+ \ifbool{NumItem}{\ifbool{SinLineasVertInt}{}{|}}{}
% Columna 'X' con DCU, columna fantasma con 'sincantidad' y columna 'c' con CDU.
- \ifbool{PrimeroDesc}{X}{
+ \ifbool{PrimeroDescrip}{X}{
\ifbool{SinCantidad}{l@{\extracolsep{0pt}}}{c}}
- % Segunda línea.
+ % Tercera línea.
\ifbool{SinCantidad}{}{\ifbool{SinLineasVertInt}{}{|}}
% Columna 'c' con DCU, columna 'r' con DUC, columna 'X' sin espacio para 'sincantidad' y columna 'X' con CDU.
\ifbool{DCU}{c}{
\ifbool{DUC}{r}{
\ifbool{SinCantidad}{X@{\extracolsep{0pt}}}{X}}}
- % Tercera línea, que sale solamente cuando no se usa 'sincantidad'.
+ % Cuarta línea, que sale solamente cuando no se usa 'sincantidad'.
\ifbool{SinCantidad}{}{\ifbool{SinLineasVertInt}{}{|}}
% Columna 'c' para DUC y columna 'r' para cualquier otro caso (DCU, CDU y 'sincantidad').
\ifbool{DUC}{c}{r}
- % Cuarta línea.
+ % Quinta línea.
\ifbool{SinLineasVertInt}{}{|}
% Columna 'c' para 'descuentos' y columna 'r' sin espacio si no hay descuentos individuales.
\ifbool{Descuentos}{c}{r@{\extracolsep{0pt}}}
- % Quinta línea, que sale solamente cuando hay descuentos.
+ % Sexta línea, que sale solamente cuando hay descuentos.
\ifbool{Descuentos}{\ifbool{SinLineasVertInt}{}{|}}{}
% Columna 'r' siempre.
r
- % Sexta y última línea.
+ % Séptima 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{6}{\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 para hacer los cálculos sobre cada ítem y establecer las macros con el contenido de cada ítem introducido.
\newcommand{\@CalculaItem}[5]{%
\addtocounter{@NumItem}{1}%
@@ -1049,7 +1061,7 @@
\expandafter\global\expandafter\edef\csname @Item@\romannumeral\value{@NumItem}@PrecioT\endcsname{\noexpand\numprint{\PrecioT}}}
\gdef\@pruebaref#1{%
- \expandafter\ifx\csname @Etiqueta@@#1\endcsname\relax
+ \expandafter\ifx\csname @Etiqueta@#1\endcsname\relax
\ClassWarning{factura}{La etiqueta `#1' no está definida}{}\ignorespaces
\@pruebareffalse
\else
@@ -1056,19 +1068,23 @@
\@pruebareftrue
\fi}
-\gdef\itemref#1{\@pruebaref{#1}\if at pruebaref \csname @Etiqueta@@#1\endcsname \fi}
-\gdef\cantref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Cantidad\endcsname \fi}
-\gdef\descref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Descripcion\endcsname \fi}
-\gdef\puref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @PrecioU\endcsname \fi}
-\gdef\dctoref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Descuento\endcsname \fi}
-\gdef\ptref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @PrecioT\endcsname \fi}
+\gdef\itemref#1{%
+ \ifbool{NumItem}{}{\ClassWarning{factura}{Es recomendable usar la opción 'numitem' para enumerar los ítems}{}}%
+ \@pruebaref{#1}\if at pruebaref \csname @Etiqueta@#1\endcsname \fi}
+\gdef\cantref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Cantidad\endcsname \fi}
+\gdef\descref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Descripcion\endcsname \fi}
+\gdef\puref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioU\endcsname \fi}
+\gdef\dctoref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Descuento\endcsname \fi}
+\gdef\ptref#1{\@pruebaref{#1}\if at pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioT\endcsname \fi}
\newcommand{\label at factura}[1]{%
- \expandafter\ifx\csname @Etiqueta@@#1\endcsname\relax
- \expandafter\global\expandafter\edef\csname @Etiqueta@@#1\endcsname{\arabic{@NumItem}}\ignorespaces
+ \expandafter\ifx\csname @Etiqueta@#1\endcsname\relax
+ \expandafter\global\expandafter\edef\csname @Etiqueta@#1\endcsname{\arabic{@NumItem}}\ignorespaces
+ \ClassInfo{factura}{Etiqueta `#1' definida para el ítem \arabic{@NumItem}}{}%
\else
- \expandafter\if\csname @Etiqueta@@#1\endcsname\the at NumItem
- \ClassInfo{factura}{Etiqueta `#1' definida para el ítem \arabic{@NumItem}}{}%
+ \edef\@label at test@uno{\csname @Etiqueta@#1\endcsname}%
+ \edef\@label at test@dos{\the at NumItem}%
+ \ifx\@label at test@uno\@label at test@dos
\else
\ClassWarning{factura}{La etiqueta `#1' se definió más de una vez}{}\ignorespaces
\fi
@@ -1081,9 +1097,20 @@
\setlength{\@EspacioVacioFinal}{\zposy{EspacioVacioFinal}sp}%
\global\@EspacioVacioInicial=\@EspacioVacioInicial% ¿por qué tendré que globalizarlas?
\global\@EspacioVacioFinal=\@EspacioVacioFinal
- \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{1pt}{\mbox{}}}%
+ \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{\@TamDescrip}{%
+ \if at linea
+ \if at lineacompleta
+ \zsaveposy{LineaNodoBCoordY}%
+ \else
+ \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{factura}{** 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.
@@ -1106,7 +1133,7 @@
\advance\dimen at -\baselineskip
\settowidth{\@TempDimen}{##3}%
\ifdim\@TempDimen=0pt\settowidth{\@TempDimen}{##2}\fi
- \hbox{\parbox{\@TempDimen}{\mbox{}\hfill\@CaracterCeldasVacias\hfill\mbox{}}}%
+ \hbox{\parbox{\@TempDimen}{\@CaracterCeldasVacias}}%
\repeat
\fi
##3}}%
@@ -1125,14 +1152,17 @@
\\
\if at conlineasha\hline\fi% Líneas para separar cada ítem, si hiciera falta.
\fi
- % Primer campo: Acá puede ir la cantidad (cdu) o la descripción (dcu y duc).
+ % 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{PrimeroDesc}
+ \ifbool{PrimeroDescrip}
{\@DescripcionAuxCmd{##3}{##1}}% dcu y duc.
{\David at XLeft{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}}}% cdu.
&
- % Segundo campo: Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc).
- \ifbool{PrimeroDesc}{%
+ % Tercer campo: Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc).
+ \ifbool{PrimeroDescrip}{%
\if at dcu
\David at XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu.
\else
@@ -1144,7 +1174,7 @@
\fi}
{\@DescripcionAuxCmd{##3}{##1}}% cdu.
&
- % Tercer campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc).
+ % Cuarto campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc).
\FPifeq\PrecioU{##4}\else\ClassWarning{factura}{** Se está introduciendo un precio con más de dos decimales: (##3 - ##4. Redondeado a \PrecioU) **}{}\fi% Advertimos cuando el precio unitario tiene más de dos decimales.
\ifbool{SinCantidad}{}{%
\if at duc
@@ -1157,15 +1187,15 @@
\fi}}% dcu y cdu.
\fi}%
&
- % Cuarto campo: Descuento.
+ % Quinto -opcional- campo: Descuento.
\ifbool{Descuentos}{%
\David at XRight{\@DescuentoAuxCmd{%
\ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
\else
- \mbox{}\hfill \@LetraNumeros \numprint{\Dcto}\%\hfill\mbox{}
+ \mbox{}\hfill \@LetraNumeros \numprint{\Dcto}\%\hfill\mbox{}%
\fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq.
&
- % Quinto campo: El total.
+ % Sexto campo: El total.
\David at XRight{\@PrecioTAuxCmd{%
\ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}%
\else
@@ -1208,20 +1238,20 @@
\@FacturaAuxInicioCmd
\ifbool{SinLineasHoriExt}{}{\hline}%
\@ZERO
- % Estamos en la cantidad, o la descripción.
- \ifbool{LineaDesdeColUno}{\@LineaNodoACoordX}{}%
- \ifbool{SinCantidad}{}{\ifbool{PrimeroDesc}{\@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}}}%
+ % Estamos en el número del ítem, si aplicara.
+ \if at lineadesdeinicio \hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}\fi
+ \ifbool{NumItem}{\@NumItemAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@NumItem \hfill\mbox{}}}{}%
+ &
+ % Avanzamos a la cantidad, o la descripción.
+ \ifbool{SinCantidad}{}{\ifbool{PrimeroDescrip}{\@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}}}%
&% Avanzamos hasta la descripción, la cantidad o el precio unitario.
- \ifbool{LineaDesdeColDos}{\@LineaNodoACoordX}{}%
- \ifbool{LineaHastaColUno}{\hspace*{-\arrayrulewidth}\@LineaNodoBCoordX\hspace*{\arrayrulewidth}}{}%
\ifbool{SinCantidad}{\@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}}
{\if at cdu \@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}\fi
\if at dcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}\fi
\if at duc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@PrecioU \space (\Moneda)\hfill\mbox{}}\fi}%
&% Avanzamos hasta el precio unitario, o la cantidad, o columna fantasma cuando es 'sincantidad'.
- \ifbool{SinCantidad}{%
- \ifbool{LineaHastaColDos}{\hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}}{}}%
- {\ifbool{LineaHastaColDos}{\hspace*{-\arrayrulewidth}\@LineaNodoBCoordX\hspace*{\arrayrulewidth}}{}%
+ \ifbool{SinCantidad}{}
+ {%
\mbox{}\hfill
\if at duc
\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}%
@@ -1232,7 +1262,7 @@
\if at descuentos \@DescuentoAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Descuento \hfill\mbox{}}\fi
&% Avanzamos hasta el precio total.
\@PrecioTAuxCmd{\mbox{}\hfill \@LetraTitCuadro \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\Moneda)\hfill\mbox{}}%
- \ifbool{LineaHastaFinal}{\hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}}{}%
+ \if at lineacompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi
\\
\ifbool{SinLineasHoriInt}{}{\hline}%
%
@@ -1244,9 +1274,7 @@
\ifdim \ht\@CajaEspacioVacio=0pt
\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.
\else
- &\usebox{\@CajaEspacioVacio}%
- \if at linea\mbox{}\zsaveposy{LineaNodoBCoordY}\fi% Se guarda la coordenada Y del punto de la derecha de la línea diagonal. Tiene que haber \mbox{}.
- &&&\\
+ \ifbool{PrimeroDescrip}{&\usebox{\@CajaEspacioVacio}&&&&\\}{&&\usebox{\@CajaEspacioVacio}&&&\\}%
\ifbool{SinLineasHoriExt}{}{\hline}% Siempre que hay relleno se pone la línea acá.
\fi
\else
@@ -1255,16 +1283,10 @@
\ifdim \ht\@CajaEspacioVacio=0pt
\else
% Rellenamos la tabla con espacio espúreo, y le agregamos las lineas externas, si aplica.
- \ifbool{SinLineasVertExt}{\multicolumn{5}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{5}{|c|}{\usebox{\@CajaEspacioVacio}}}\\
+ \ifbool{SinLineasVertExt}{\multicolumn{6}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{6}{|c|}{\usebox{\@CajaEspacioVacio}}}\\
\fi
- % Abrimos la tabla para escribir los totales, y le agregamos las líneas verticales externas, si aplica.
- \ifbool{SinLineasVertExt}
- {\multicolumn{5}{r}\begingroup
- \ifdim \ht\@CajaEspacioVacio=0pt \else \if at linea\zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}\fi\fi
- \begin{tabular}[b]{@{\extracolsep{2\tabcolsep}}lr}}
- {\multicolumn{5}{|r}\begingroup
- \ifdim \ht\@CajaEspacioVacio=0pt \else \if at linea\zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}\fi\fi
- \begin{tabular}[b]{@{\extracolsep{2\tabcolsep}}lr|}}% Una vaina loca... tuve que meter también el tabular con la línea '|' porque no pude poner esa línea en el multicolumn.
+ % 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
@@ -1462,14 +1484,9 @@
\RequirePackage{eso-pic}% Para poder 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}
- {\booltrue{LineaDesdeColUno}\booltrue{LineaHastaFinal}}
- {\ifbool{PrimeroDesc}
- {\booltrue{LineaDesdeColUno}\booltrue{LineaHastaColUno}}
- {\booltrue{LineaDesdeColDos}\booltrue{LineaHastaColDos}}}
+ \ifbool{SinLineasVertInt}{\@lineacompletatrue}
\else
- \ifbool{SinCantidad}{\booltrue{LineaDesdeColDos}}{\booltrue{LineaDesdeColUno}}
- \booltrue{LineaHastaTotal}
+ \@lineahastatotaltrue\@lineadesdeiniciotrue
\fi
\fi
@@ -1497,7 +1514,7 @@
\let\@ITEM\@CalculaItem
\BODY
\@CalculaTotalesI}
- \NewDocumentCommand{\Descripcion}{s +m}{}
+ \NewDocumentCommand{\Descripcion}{+m}{}
\fi
\if at reporte
Modified: trunk/Master/texmf-dist/tex/latex/factura/factura.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/factura/factura.def 2016-06-25 14:08:05 UTC (rev 41537)
+++ trunk/Master/texmf-dist/tex/latex/factura/factura.def 2016-06-25 22:10:38 UTC (rev 41538)
@@ -35,7 +35,7 @@
%% and factura-beispiel-rechnung.tex.
%%
\ProvidesFile{factura.def}
-[2016/05/16 v2.72
+[2016/06/25 v2.82
Archivo valores iniciales y condiciones de borde para factura.cls
]
@@ -70,6 +70,7 @@
%% Macros que guardan textos que corresponden a nombres de campos:
\def\@@Fecha{Fecha de emisi\'on:}
\def\@@RazonSocial{Raz\'on social:}
+\def\@@NumItem{\#}
\def\@@Cantidad{Cantidad}
\def\@@Descripcion{Descripci\'on}
\def\@@PrecioU{Precio U.}
@@ -111,13 +112,17 @@
%% i) carácter para separar el teléfono del e-mail del cliente,
%% ii) carácter para los campos vacíos cuando se usa \ItemX,
-%% iii) carácter para las celdas vacíos cuando la descripción del ítem ocupa más que una línea.
+%% iii) carácter para las celdas vacías cuando la descripción del ítem ocupa más que una línea.
%% iv) carácter de retorno de carro en el cuadro de la factura,
\def\@CaracterSeparaTelefonoEmail{$\diamond$}
\def\@CaracterItemXVacio{...}
-\def\@CaracterCeldasVacias{$\cdot$}
-\def\@CaracterCR{$\lcurvearrowsw\!$}% (del paquete MnSymbol)
-%% \def\@CaracterCR{$\hookleftarrow$}% también puede usarse este.
+\def\@CaracterCeldasVacias{\mbox{}\hfill$\cdot$\hfill\mbox{}}
+\def\@CaracterCR{\flechaCR}
+\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}}}
%% Separación entre la última letra y el carácter que indica que se continúa en la línea siguiente en la descripción cuando ocupa más de una línea. No vale la pena hacer una macro para cambiar esto.
\setlength{\@SeparaFinLineaDesc}{0.05cm}
More information about the tex-live-commits
mailing list