使用 \hfill 时如何将最后一个元素对齐到右侧?

使用 \hfill 时如何将最后一个元素对齐到右侧?

我正在根据 CSV 文件制作一份酒单(请参阅此处的第一个问题:如何从 Excel 导入数据并将其格式化为 LaTeX 中的文本?),我需要将价格在右侧对齐。

为此,我使用该datatool包从我的电子表格中获取信息,\DTLforeach迭代我想要做的事情并将\hfill我的价格调整到右侧。(见图片后的代码)

正如您在图片上看到的,除了每个(子子)部分的最后一行之外,它对每一行都运行得很好,而最后一行稍微有点错位:

在此处输入图片描述

这是我的代码:

\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}

% Pour modifer les marges
\usepackage{geometry}
% Marges du document 
\geometry{hmargin=1.5cm,vmargin=1.5cm}


% To remove the heading of the table of contents ("Contents")
\makeatletter
\renewcommand\tableofcontents{%
    \@starttoc{toc}%
}
\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.
\usepackage{enumitem}

% Datatool package to load external files (csv)
\usepackage{datatool}

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

\title{Carte des Vins}
\author{B}
\date{\today}

%--------------------------%
\setcounter{secnumdepth}{-2}
\begin{document}
\maketitle
\tableofcontents

%--------------------------%
\newpage
\section{Bordeaux} 

% Load CSV database (here bordeaux.csv)
% and give it a label (here BOR)
\DTLloaddb{BOR}{bordeaux.csv}

    \subsection{Red}
%%%%%%% CUT CODE %%%%%%%%%%%%%%%%%%%%%%%%%
\newpage

            \subsubsection{Saint-Julien}
%%%%%%%%%%%%%%%
% Iteration for Bordeaux Red Saint-Julien (R03)
\DTLforeach*[\DTLiseq{\Region}{R03}] % 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:
\begin{itemize} %%% ABSENT IN MY ORIGINAL CODE %%%
    \item[]
    \textbf{\Vintage}
    \textbf{ \Name}
    \textit{ \Classification}
    \hfill\CostPrice
\end{itemize} %%% ABSENT IN MY ORIGINAL CODE %%%
}
%%%%%%%%%%%%%%%

        \subsubsection{Margaux}
%%%%%%%%%%%%%%%
% Iteration for Bordeaux Red Margaux (R04)
%%%%%%%%%%%%%%%%% CUT CODE%%%%%%%
\end{document}

我怎样才能将所有价格排列在右侧?

我的 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 

答案1

您的代码有两个明显问题。您收到与这两个问题相关的错误。

首先你打错了

\makeatother

\makeatotherx导致 LaTeX 抱怨

! Undefined control sequence.
l.22 \makeatotherx

其次,您的循环代码在\DTLforeach调用中\item,但没有周围的列表环境知道如何处理它。

由于您想使用来获得一条新线路,因此在这种情况下\item我建议使用平原。trivlist

%\RequirePackage{filecontents}
\begin{filecontents*}{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 
\end{filecontents*}
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}

\makeatletter
\renewcommand\tableofcontents{%
    \@starttoc{toc}%
}
\makeatother

\usepackage{enumitem}
\usepackage{datatool}

\begin{document}
\section{Bordeaux} 
\DTLloaddb{BOR}{bordeaux.csv}
\subsection{Red}
\subsubsection{Saint-Julien}

\begin{trivlist}
\DTLforeach*[\DTLiseq{\Region}{R03}] % 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[]
    \textbf{\Vintage}
    \textbf{ \Name}
    \textit{ \Classification}
    \hfill\CostPrice
}
\end{trivlist}

\end{document}

可能表格(tabular)更合适。

答案2

除了代码中的问题之外,根本问题是\CostPrice总是有一个结束空格,正如使用所看到的那样\texttt{\meaning\CostPrice}+++

在此处输入图片描述

这是因为您的 csv 数据在逗号前有空格,因为datatool没有修剪前导或尾随空格。

请注意,空格按通常的 TeX 方式计算,并且不会从分隔符的任何一侧被修剪。(用户datatool手册第 46 页)

感谢@NicolaTalbot 在评论中善意地指出了这一点。

以下是您的数据文件的摘录:

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 

其中空格表示货币项目周围。

以下内容(摘自@moewe 对 OP 的评论)

\begin{itemize}
%%%%%%%%%%%%%%%
% Iteration for Bordeaux Red Saint-Julien (R03)
\DTLforeach*[\DTLiseq{\Region}{R03}] % 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[]
    \textbf{\Vintage}
    \textbf{ \Name}
    \textit{ \Classification}
    \hfill\CostPrice
}
%%%%%%%%%%%%%%%
\end{itemize}

没有问题

在此处输入图片描述

多余的空间则不显示。(它被项目段落抑制)

备注:事实上即使你的代码有错误,你也可以通过以下方式避免这个问题:

%%%%%%%%%%%%%%%
% Iteration for Bordeaux Red Saint-Julien (R03)
\DTLforeach*[\DTLiseq{\Region}{R03}] % 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[]
    \textbf{\Vintage}
    \textbf{ \Name}
    \textit{ \Classification}
    \hfill\CostPrice
}%<----- suppress space from line end
%%%%%%%%%%%%%%%

因为这样段落末尾就只有一个空格标记,而不是两个。当然更好的方法是换行,itemize否则\item是非法的。

相关内容