How to align the last element on the right when using hfill?

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP



How to align the last element on the right when using hfill?



I am making a wine list from a CSV file (see my first question here: How to import data from excel and format it as text in LaTeX?) and I need to align the prices on the right.



To do this, I used the datatool package to fetch the informations from my spreadsheet, DTLforeach to iterate what I wanted to do and hfill to align my prices on the right. (see code after the picture)


datatool


DTLforeach


hfill



As you can see on the picture, it worked very well for every line but the last one of each (subsub)section, which is slightly misaligned:



enter image description here



Here is my code:


documentclass[12pt]article
usepackage[utf8]inputenc

% Pour modifer les marges
usepackagegeometry
% Marges du document
geometryhmargin=1.5cm,vmargin=1.5cm


% To remove the heading of the table of contents ("Contents")
makeatletter
renewcommandtableofcontents%
@starttoctoc%

makeatother %%% WAS makeatotherx = ERROR %%%

% To make itemized lists
% This package provides user control over the layout of the three basic list environments: enumerate, itemize and description. It supersedes both enumerate and mdwlist (providing well-structured replacements for all their funtionality), and in addition provides functions to compute the layout of labels, and to ‘clone’ the standard environments, to create new environments with counters of their own.
usepackageenumitem

% Datatool package to load external files (csv)
usepackagedatatool

%--------------------------%

titleCarte des Vins
authorB
datetoday

%--------------------------%
setcountersecnumdepth-2
begindocument
maketitle
tableofcontents

%--------------------------%
newpage
sectionBordeaux

% Load CSV database (here bordeaux.csv)
% and give it a label (here BOR)
DTLloaddbBORbordeaux.csv

subsectionRed
%%%%%%% CUT CODE %%%%%%%%%%%%%%%%%%%%%%%%%
newpage

subsubsectionSaint-Julien
%%%%%%%%%%%%%%%
% Iteration for Bordeaux Red Saint-Julien (R03)
DTLforeach*[DTLiseqRegionR03] % Condition
BOR % Database label
Vintage=Vintage,Name=Name,Classification=Classification,Type=Type,Origin=Origin,Region=Region,CostPrice=CostPrice % Assignment
% Stuff to do at each iteration:
beginitemize %%% ABSENT IN MY ORIGINAL CODE %%%
item
textbfVintage
textbf Name
textit Classification
hfillCostPrice
enditemize %%% ABSENT IN MY ORIGINAL CODE %%%

%%%%%%%%%%%%%%%

subsubsectionMargaux
%%%%%%%%%%%%%%%
% Iteration for Bordeaux Red Margaux (R04)
%%%%%%%%%%%%%%%%% CUT CODE%%%%%%%
enddocument



How can I align all my prices on the right?



Excerpt of my CSV file:


CODE,Vintage,Name,Classification,Origin,Size,Type,Wine,Region,Stockholding,CostPrice,TOTCostPrice,TOTCostPriceBis
GRUAUD LAROSE,1971,Château Gruaud-Larose,2ème Grand Cru Classé ,Saint-Julien,Bottle,Red,Bordeaux,R03,2.0, £15.00 , £30.00 , £30.00
LALANDE BORIE,2011,Château Lalande-Borie,,Saint-Julien,Bottle,Red,Bordeaux,R03,35.0, £19.70 , £689.50 , £689.50
RESERVE LEOV-BARTN,2011,La Réserve de Léoville Barton,,Saint-Julien,Bottle,Red,Bordeaux,R03,12.0, £20.86 , £250.32 , £250.32
CLOS DU MARQUIS,2004,Clos du Marquis,,Saint-Julien,Bottle,Red,Bordeaux,R03,3.0, £35.83 , £107.49 , £107.49
GRUAUD LAROSE,2005,Château Gruaud-Larose,2ème Grand Cru Classé ,Saint-Julien,Bottle,Red,Bordeaux,R03,16.0, £43.49 , £695.84 , £695.84
DUCRU BEAUCAILLOU,1978,Château Ducru-Beaucaillou,2ème Grand Cru Classé ,Saint-Julien,Bottle,Red,Bordeaux,R03,2.0, £56.52 , £113.04 , £113.04
LAGRANGE 3EME SJ,2005,Château Lagrange,3ème Grand Cru Classé ,Saint-Julien,Bottle,Red,Bordeaux,R03,6.0, £58.75 , £352.50 , £352.50
LEOVILLE POYFERRE,2000,Château Léoville Poyferre,2ème Grand Cru Classé ,Saint-Julien,Bottle,Red,Bordeaux,R03,2.0, £73.33 , £146.66 , £146.66
GRUARD LAROSE,1986,Château Gruaud-Larose,2ème Grand Cru Classé ,Saint-Julien,Bottle,Red,Bordeaux,R03,1.0, £100.00 , £100.00 , £100.00





Unfortunately the code as shown can't be run (a good MWE for LaTeX should start with documentclass and should have a begindocument...enddocument pair, in this case it would also help if you could supply example .csv data, see tex.meta.stackexchange.com/q/228/35864), so I can only guess that you are missing a % somewhere.
– moewe
59 mins ago



documentclass


begindocument...enddocument


.csv


%





I did compile your document here... Have you noticed you are getting lots of compilation errors? You really shouldn't ignore these. Your code is doing an item without being wrapped in a list environment (and this is adding a space after the last entry). Try adding beginitemize before the DTLforeach command and an enditemize after it. The output should look right then. Ooh, and you have a typo. You have makeatotherx, with an extra x.
– Phelype Oleinik
30 mins ago



item


beginitemize


DTLforeach


enditemize


makeatotherx


x





I get two kinds of errors: (1) ! Undefined control sequence. l.28 makeatotherx. It should have been makeatother instead. (2) ! LaTeX Error: Lonely item--perhaps a missing list environment.. This is because you have item in your code when there is no itemize or enumerate to make use of it. That causes an error.
– moewe
27 mins ago


! Undefined control sequence. l.28 makeatotherx


makeatother


! LaTeX Error: Lonely item--perhaps a missing list environment.


item


itemize


enumerate





Yes, but errors must be fixed even if superficially they don't affect the PDF - the absolutely affect the output. TeX has a limited ability to recover from errors, but usually it has to guess what to do and that is rarely exactly what you intended to happen. (1) Replace makeatotherx with makeatother. (2) Either don't use item at all or wrap it into an beginitemize...enditemize.
– moewe
22 mins ago


makeatotherx


makeatother


item


beginitemize...enditemize





no space shows if you follow @moewe advice to add itemize environment to wrap around the entire contents of subsubsection Saint-Julien
– jfbu
14 mins ago


itemize




2 Answers
2



There are two obvious problems with your code. You get errors about both of them.



Firstly you mistyped


makeatother



as makeatotherx which causes LaTeX to complain


makeatotherx


! Undefined control sequence.
l.22 makeatotherx



Secondly your loop code in DTLforeach calls item but there is no surrounding list environment that would know how to deal with it.


DTLforeach


item



Since you want to use item to get a new line, I suggest a plain trivlist in this case.


item


trivlist


%RequirePackagefilecontents
beginfilecontents*bordeaux.csv
CODE,Vintage,Name,Classification,Origin,Size,Type,Wine,Region,Stockholding,CostPrice,TOTCostPrice,TOTCostPriceBis
GRUAUD LAROSE,1971,Château Gruaud-Larose,2ème Grand Cru Classé ,Saint-Julien,Bottle,Red,Bordeaux,R03,2.0, £15.00 , £30.00 , £30.00
LALANDE BORIE,2011,Château Lalande-Borie,,Saint-Julien,Bottle,Red,Bordeaux,R03,35.0, £19.70 , £689.50 , £689.50
RESERVE LEOV-BARTN,2011,La Réserve de Léoville Barton,,Saint-Julien,Bottle,Red,Bordeaux,R03,12.0, £20.86 , £250.32 , £250.32
CLOS DU MARQUIS,2004,Clos du Marquis,,Saint-Julien,Bottle,Red,Bordeaux,R03,3.0, £35.83 , £107.49 , £107.49
GRUAUD LAROSE,2005,Château Gruaud-Larose,2ème Grand Cru Classé ,Saint-Julien,Bottle,Red,Bordeaux,R03,16.0, £43.49 , £695.84 , £695.84
DUCRU BEAUCAILLOU,1978,Château Ducru-Beaucaillou,2ème Grand Cru Classé ,Saint-Julien,Bottle,Red,Bordeaux,R03,2.0, £56.52 , £113.04 , £113.04
LAGRANGE 3EME SJ,2005,Château Lagrange,3ème Grand Cru Classé ,Saint-Julien,Bottle,Red,Bordeaux,R03,6.0, £58.75 , £352.50 , £352.50
LEOVILLE POYFERRE,2000,Château Léoville Poyferre,2ème Grand Cru Classé ,Saint-Julien,Bottle,Red,Bordeaux,R03,2.0, £73.33 , £146.66 , £146.66
GRUARD LAROSE,1986,Château Gruaud-Larose,2ème Grand Cru Classé ,Saint-Julien,Bottle,Red,Bordeaux,R03,1.0, £100.00 , £100.00 , £100.00
endfilecontents*
documentclass[12pt]article
usepackage[utf8]inputenc

makeatletter
renewcommandtableofcontents%
@starttoctoc%

makeatother

usepackageenumitem
usepackagedatatool

begindocument
sectionBordeaux
DTLloaddbBORbordeaux.csv
subsectionRed
subsubsectionSaint-Julien

begintrivlist
DTLforeach*[DTLiseqRegionR03] % Condition
BOR % Database label
Vintage=Vintage,Name=Name,Classification=Classification,Type=Type,Origin=Origin,Region=Region,CostPrice=CostPrice % Assignment
% Stuff to do at each iteration:
item
textbfVintage
textbf Name
textit Classification
hfillCostPrice

endtrivlist

enddocument



Possibly a table (tabular) would be a better fit.


tabular



Apart from the problem in the code, the root issue is that CostPrice always has an ending space, as one can see by using textttmeaningCostPrice+++.


CostPrice


textttmeaningCostPrice+++



enter image description here



This may come from the fact that your csv data has spaces before the commas, but I suppose datatool knows how to remove such trailing space (it is harder in TeX to remove a trailing space than a leading one by the way).



Anyway if you use


beginitemize
%%%%%%%%%%%%%%%
% Iteration for Bordeaux Red Saint-Julien (R03)
DTLforeach*[DTLiseqRegionR03] % Condition
BOR % Database label
Vintage=Vintage,Name=Name,Classification=Classification,Type=Type,Origin=Origin,Region=Region,CostPrice=CostPrice % Assignment
% Stuff to do at each iteration:
item
textbfVintage
textbf Name
textit Classification
hfillCostPrice

%%%%%%%%%%%%%%%
enditemize



There is no problem



enter image description here



The extra space doesnt show then. (it is suppressed by item paragraph)



Remark: in fact even with your buggy code you could have avoided the sapce this way:


%%%%%%%%%%%%%%%
% Iteration for Bordeaux Red Saint-Julien (R03)
DTLforeach*[DTLiseqRegionR03] % Condition
BOR % Database label
Vintage=Vintage,Name=Name,Classification=Classification,Type=Type,Origin=Origin,Region=Region,CostPrice=CostPrice % Assignment
% Stuff to do at each iteration:
item
textbfVintage
textbf Name
textit Classification
hfillCostPrice
%<----- suppress space from line end
%%%%%%%%%%%%%%%



Because then there is only ONE not TWO space tokens at the end of paragraph. Of course much better is to wrap in itemize else item is illegal.


itemize


item






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

Firebase Auth - with Email and Password - Check user already registered

Dynamically update html content plain JS

Creating a leaderboard in HTML/JS