From ae27a23f9f06830c17b55aa47224a54607700028 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 25 Jun 2016 22:10:38 +0000 Subject: factura (25jun16) git-svn-id: svn://tug.org/texlive/trunk@41538 c570f23f-e606-0410-a88d-b1316a301751 --- .../doc/latex/factura/factura-ejemplo-factura2.tex | 2 + .../doc/latex/factura/factura-ejemplo-factura6.tex | 7 +- .../doc/latex/factura/factura-ejemplo-reporte2.tex | 5 +- Master/texmf-dist/doc/latex/factura/factura.pdf | Bin 865626 -> 861883 bytes Master/texmf-dist/source/latex/factura/factura.dtx | 272 ++++++++++++--------- Master/texmf-dist/tex/latex/factura/factura.cls | 217 ++++++++-------- Master/texmf-dist/tex/latex/factura/factura.def | 15 +- 7 files changed, 294 insertions(+), 224 deletions(-) diff --git a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura2.tex b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura2.tex index 5927ac04e4a..5e062ee6b00 100644 --- a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura2.tex +++ b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura2.tex @@ -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, diff --git a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura6.tex b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura6.tex index b580d2f809a..b970c7fd41c 100644 --- a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura6.tex +++ b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura6.tex @@ -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 @@ csv, \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} diff --git a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex index d17b8582ac4..aa8a3a8b6f9 100644 --- a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex +++ b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex @@ -74,6 +74,7 @@ soloreporte, \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 @@ soloreporte, \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} diff --git a/Master/texmf-dist/doc/latex/factura/factura.pdf b/Master/texmf-dist/doc/latex/factura/factura.pdf index ed6d057386b..c699f180d04 100644 Binary files a/Master/texmf-dist/doc/latex/factura/factura.pdf and b/Master/texmf-dist/doc/latex/factura/factura.pdf differ diff --git a/Master/texmf-dist/source/latex/factura/factura.dtx b/Master/texmf-dist/source/latex/factura/factura.dtx index 7f45dc8f7f0..c61c15b4fd9 100644 --- a/Master/texmf-dist/source/latex/factura/factura.dtx +++ b/Master/texmf-dist/source/latex/factura/factura.dtx @@ -163,7 +163,7 @@ and factura-beispiel-rechnung.tex. %\ProvidesClass{factura} %\ProvidesFile{factura.def} %<*class|def> -[2016/05/16 v2.72 +[2016/06/25 v2.82 %Clase para elaborar facturas legales %en la República Bolivariana de Venezuela. %Archivo valores iniciales y condiciones de borde para factura.cls @@ -251,6 +251,10 @@ and factura-beispiel-rechnung.tex. \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 @@ and factura-beispiel-rechnung.tex. % \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 @@ and factura-beispiel-rechnung.tex. % \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 @@ and factura-beispiel-rechnung.tex. % \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 @@ and factura-beispiel-rechnung.tex. % % } % -% \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 @@ and factura-beispiel-rechnung.tex. % % 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 @@ and factura-beispiel-rechnung.tex. % 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 @@ and factura-beispiel-rechnung.tex. \newif\if@sinnumero \newif\if@conlineasha \newif\if@linea +\newif\if@lineacompleta +\newif\if@lineahastatotal +\newif\if@lineadesdeinicio \newif\if@G \newif\if@BIR \newif\if@BIA @@ -1363,17 +1381,10 @@ and factura-beispiel-rechnung.tex. \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 @@ and factura-beispiel-rechnung.tex. \@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@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 @@ and factura-beispiel-rechnung.tex. \booltrue{SinCantidad} \if@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@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 @@ and factura-beispiel-rechnung.tex. \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@reporte @@ -1586,6 +1597,7 @@ and factura-beispiel-rechnung.tex. %% 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 @@ and factura-beispiel-rechnung.tex. %% 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 @@ and factura-beispiel-rechnung.tex. \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 @@ and factura-beispiel-rechnung.tex. \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 @@ and factura-beispiel-rechnung.tex. \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 @@ and factura-beispiel-rechnung.tex. %% 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@factura - \RequirePackage{graphicx}% + \RequirePackage{graphicx} \ifx&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi \ifx&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi - \savebox{\@CajaFirmaEmisor}{#1}% + \savebox{\@CajaFirmaEmisor}{#1} \if@reporte \expandafter\AtBeginShipoutNext \else @@ -1964,30 +1983,30 @@ and factura-beispiel-rechnung.tex. \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@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@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 @@ and factura-beispiel-rechnung.tex. %% 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 @@ and factura-beispiel-rechnung.tex. \newlength{\@TamResumen} \newlength{\@TamFinalEncabez} \newlength{\@TamLineaFirmas} +\newlength{\@TamNumItem} \newlength{\@TamCantidad} +\newlength{\@TamDescrip} \newlength{\@TamPrecioU} \newlength{\@TamDescuento} \newlength{\@TamPrecioT} @@ -2068,7 +2089,7 @@ and factura-beispiel-rechnung.tex. %% 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 @@ and factura-beispiel-rechnung.tex. \fi \if@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@reporte @@ -2130,6 +2151,7 @@ and factura-beispiel-rechnung.tex. %% 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@impdesc\hfill\ \@EscribeTipoDeImpuesto{#2}\fi% \par\global\count1=\prevgraf}}% @@ -2160,25 +2182,30 @@ and factura-beispiel-rechnung.tex. \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 @@ and factura-beispiel-rechnung.tex. \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi \if@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 @@ and factura-beispiel-rechnung.tex. %% 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@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 @@ and factura-beispiel-rechnung.tex. % 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 @@ and factura-beispiel-rechnung.tex. \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@pruebaref \csname @Etiqueta@@#1\endcsname \fi} -\gdef\cantref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Cantidad\endcsname \fi} -\gdef\descref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Descripcion\endcsname \fi} -\gdef\puref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @PrecioU\endcsname \fi} -\gdef\dctoref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Descuento\endcsname \fi} -\gdef\ptref#1{\@pruebaref{#1}\if@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@pruebaref \csname @Etiqueta@#1\endcsname \fi} +\gdef\cantref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Cantidad\endcsname \fi} +\gdef\descref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Descripcion\endcsname \fi} +\gdef\puref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioU\endcsname \fi} +\gdef\dctoref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Descuento\endcsname \fi} +\gdef\ptref#1{\@pruebaref{#1}\if@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@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@NumItem - \ClassInfo{factura}{Etiqueta `#1' definida para el ítem \arabic{@NumItem}}{}% + \edef\@label@test@uno{\csname @Etiqueta@#1\endcsname}% + \edef\@label@test@dos{\the@NumItem}% + \ifx\@label@test@uno\@label@test@dos \else \ClassWarning{factura}{La etiqueta `#1' se definió más de una vez}{}\ignorespaces \fi @@ -2487,9 +2526,20 @@ and factura-beispiel-rechnung.tex. \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@linea + \if@lineacompleta + \zsaveposy{LineaNodoBCoordY}% + \else + \if@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@SavePos, \David@XStart, \David@XEnd, \David@XPad, \David@XLeft y \David@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 @@ and factura-beispiel-rechnung.tex. \advance\dimen@-\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 @@ and factura-beispiel-rechnung.tex. \\ \if@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@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@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@dcu \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu. \else @@ -2550,7 +2603,7 @@ and factura-beispiel-rechnung.tex. \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@duc @@ -2563,15 +2616,15 @@ and factura-beispiel-rechnung.tex. \fi}}% dcu y cdu. \fi}% & - % Cuarto campo: Descuento. + % Quinto -opcional- campo: Descuento. \ifbool{Descuentos}{% \David@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@XRight{\@PrecioTAuxCmd{% \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% \else @@ -2614,20 +2667,20 @@ and factura-beispiel-rechnung.tex. \@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@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@cdu \@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}\fi \if@dcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}\fi \if@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@duc \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}% @@ -2638,7 +2691,7 @@ and factura-beispiel-rechnung.tex. \if@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@lineacompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi \\ \ifbool{SinLineasHoriInt}{}{\hline}% % @@ -2650,9 +2703,7 @@ and factura-beispiel-rechnung.tex. \ifdim \ht\@CajaEspacioVacio=0pt \ifbool{SinLineasHoriExt}{}{\if@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@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 @@ and factura-beispiel-rechnung.tex. \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@linea\zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}\fi\fi - \begin{tabular}[b]{@{\extracolsep{2\tabcolsep}}lr}} - {\multicolumn{5}{|r}\begingroup - \ifdim \ht\@CajaEspacioVacio=0pt \else \if@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@agrupado \@EscribeTotalColAgrupado @@ -2869,14 +2914,9 @@ and factura-beispiel-rechnung.tex. \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@linea\@DibujaLinea\fi} \if@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 @@ and factura-beispiel-rechnung.tex. \let\@ITEM\@CalculaItem \BODY \@CalculaTotalesI} - \NewDocumentCommand{\Descripcion}{s +m}{} + \NewDocumentCommand{\Descripcion}{+m}{} \fi \if@reporte @@ -3274,6 +3314,7 @@ and factura-beispiel-rechnung.tex. %%% El reporte se imprime en las dos caras del papel (twoside), % %%% Cuadro de la factura sin la columna de cantidades (sincantidad), +%%% Con la columna para enumerar los ítems (numitem), %%% Con descuentos individuales (descuentos), % %%% Agrupados los totales por gravámenes (agrupado), @@ -3361,6 +3402,7 @@ and factura-beispiel-rechnung.tex. %nospanish, %twoside, %sincantidad, +%numitem, %descuentos, %filas, %centrado, @@ -3514,7 +3556,7 @@ and factura-beispiel-rechnung.tex. %\begin{factura} % \Item{1}{ítem con IVA general}{1000} % \Item{2}{ítem con IVA general}{1000}\label{primeritem} -% \Item{4}{otro ítem con IVA general}{100} +% \Item{4}{otro ítem con IVA general}{100} % \ItemR{1}{ítem con IVA reducido}{1000} % \ItemA{1}{ítem con IVA adicional}{1000} % \ItemE{1}{ítem exento de impuesto}{1000} @@ -3539,8 +3581,8 @@ and factura-beispiel-rechnung.tex. %\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. %} % \FirmaReporte[\includegraphics[width=5cm]{factura-ejemplo-firma}][0pt][21pt] % \vspace{1.5cm}\FirmaReporte diff --git a/Master/texmf-dist/tex/latex/factura/factura.cls b/Master/texmf-dist/tex/latex/factura/factura.cls index 12f553c9579..01d934a7c6c 100644 --- a/Master/texmf-dist/tex/latex/factura/factura.cls +++ b/Master/texmf-dist/tex/latex/factura/factura.cls @@ -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 @@ en la República Bolivariana de Venezuela. \newif\if@sinnumero \newif\if@conlineasha \newif\if@linea +\newif\if@lineacompleta +\newif\if@lineahastatotal +\newif\if@lineadesdeinicio \newif\if@G \newif\if@BIR \newif\if@BIA @@ -95,17 +98,10 @@ en la República Bolivariana de Venezuela. \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 @@ en la República Bolivariana de Venezuela. \@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@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 @@ en la República Bolivariana de Venezuela. \booltrue{SinCantidad} \if@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@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 @@ en la República Bolivariana de Venezuela. \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@reporte @@ -374,7 +370,7 @@ en la República Bolivariana de Venezuela. \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 @@ en la República Bolivariana de Venezuela. \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 @@ en la República Bolivariana de Venezuela. \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 @@ en la República Bolivariana de Venezuela. %% 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@factura - \RequirePackage{graphicx}% + \RequirePackage{graphicx} \ifx&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi \ifx&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi - \savebox{\@CajaFirmaEmisor}{#1}% + \savebox{\@CajaFirmaEmisor}{#1} \if@reporte \expandafter\AtBeginShipoutNext \else @@ -561,30 +557,30 @@ en la República Bolivariana de Venezuela. \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@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@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 @@ en la República Bolivariana de Venezuela. %% 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 @@ en la República Bolivariana de Venezuela. \newlength{\@TamResumen} \newlength{\@TamFinalEncabez} \newlength{\@TamLineaFirmas} +\newlength{\@TamNumItem} \newlength{\@TamCantidad} +\newlength{\@TamDescrip} \newlength{\@TamPrecioU} \newlength{\@TamDescuento} \newlength{\@TamPrecioT} @@ -665,7 +663,7 @@ en la República Bolivariana de Venezuela. %% 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 @@ en la República Bolivariana de Venezuela. \fi \if@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@reporte @@ -727,6 +725,7 @@ en la República Bolivariana de Venezuela. %% 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@impdesc\hfill\ \@EscribeTipoDeImpuesto{#2}\fi% \par\global\count1=\prevgraf}}% @@ -757,25 +756,30 @@ en la República Bolivariana de Venezuela. \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 @@ en la República Bolivariana de Venezuela. \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi \if@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 @@ en la República Bolivariana de Venezuela. %% 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@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,26 +1061,30 @@ en la República Bolivariana de Venezuela. \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 \@pruebareftrue \fi} -\gdef\itemref#1{\@pruebaref{#1}\if@pruebaref \csname @Etiqueta@@#1\endcsname \fi} -\gdef\cantref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Cantidad\endcsname \fi} -\gdef\descref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Descripcion\endcsname \fi} -\gdef\puref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @PrecioU\endcsname \fi} -\gdef\dctoref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Descuento\endcsname \fi} -\gdef\ptref#1{\@pruebaref{#1}\if@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@pruebaref \csname @Etiqueta@#1\endcsname \fi} +\gdef\cantref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Cantidad\endcsname \fi} +\gdef\descref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Descripcion\endcsname \fi} +\gdef\puref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioU\endcsname \fi} +\gdef\dctoref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Descuento\endcsname \fi} +\gdef\ptref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioT\endcsname \fi} \newcommand{\label@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@NumItem - \ClassInfo{factura}{Etiqueta `#1' definida para el ítem \arabic{@NumItem}}{}% + \edef\@label@test@uno{\csname @Etiqueta@#1\endcsname}% + \edef\@label@test@dos{\the@NumItem}% + \ifx\@label@test@uno\@label@test@dos \else \ClassWarning{factura}{La etiqueta `#1' se definió más de una vez}{}\ignorespaces \fi @@ -1081,9 +1097,20 @@ en la República Bolivariana de Venezuela. \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@linea + \if@lineacompleta + \zsaveposy{LineaNodoBCoordY}% + \else + \if@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@SavePos, \David@XStart, \David@XEnd, \David@XPad, \David@XLeft y \David@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 @@ en la República Bolivariana de Venezuela. \advance\dimen@-\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 @@ en la República Bolivariana de Venezuela. \\ \if@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@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@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@dcu \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu. \else @@ -1144,7 +1174,7 @@ en la República Bolivariana de Venezuela. \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@duc @@ -1157,15 +1187,15 @@ en la República Bolivariana de Venezuela. \fi}}% dcu y cdu. \fi}% & - % Cuarto campo: Descuento. + % Quinto -opcional- campo: Descuento. \ifbool{Descuentos}{% \David@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@XRight{\@PrecioTAuxCmd{% \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% \else @@ -1208,20 +1238,20 @@ en la República Bolivariana de Venezuela. \@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@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@cdu \@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}\fi \if@dcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}\fi \if@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@duc \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}% @@ -1232,7 +1262,7 @@ en la República Bolivariana de Venezuela. \if@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@lineacompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi \\ \ifbool{SinLineasHoriInt}{}{\hline}% % @@ -1244,9 +1274,7 @@ en la República Bolivariana de Venezuela. \ifdim \ht\@CajaEspacioVacio=0pt \ifbool{SinLineasHoriExt}{}{\if@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@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 @@ en la República Bolivariana de Venezuela. \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@linea\zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}\fi\fi - \begin{tabular}[b]{@{\extracolsep{2\tabcolsep}}lr}} - {\multicolumn{5}{|r}\begingroup - \ifdim \ht\@CajaEspacioVacio=0pt \else \if@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@agrupado \@EscribeTotalColAgrupado @@ -1462,14 +1484,9 @@ en la República Bolivariana de Venezuela. \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@linea\@DibujaLinea\fi} \if@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 @@ en la República Bolivariana de Venezuela. \let\@ITEM\@CalculaItem \BODY \@CalculaTotalesI} - \NewDocumentCommand{\Descripcion}{s +m}{} + \NewDocumentCommand{\Descripcion}{+m}{} \fi \if@reporte diff --git a/Master/texmf-dist/tex/latex/factura/factura.def b/Master/texmf-dist/tex/latex/factura/factura.def index 676d18e0aa9..70e4979b681 100644 --- a/Master/texmf-dist/tex/latex/factura/factura.def +++ b/Master/texmf-dist/tex/latex/factura/factura.def @@ -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 @@ Archivo valores iniciales y condiciones de borde para factura.cls %% 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 @@ Archivo valores iniciales y condiciones de borde para factura.cls %% 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} -- cgit v1.2.3