如何控制 LaTeX 中图片的精确尺寸?

如何控制 LaTeX 中图片的精确尺寸?

这个问题很简单:我希望能够使用例如宏来获取 LaTeX 中图片的精确尺寸\the

事实上,我已经找到了方法\settoheight{}等等,但根本不起作用。我得到的结果与我在图像属性中看到的结果不匹配(我想这是英文名称)。结果:8pt 对 1300 像素。这可能是误用...

编辑:最后,我的目标是找到一种方法来让图片适合 LaTeX。如果宽度和高度都小于主体的尺寸,那么它应该居中。它看起来像这样:


要求:

\usepackage{graphicx}
\usepackage{xifthen}
\usepackage{calc}

代码(非常丑陋,我同意):

% Centrering+fitting for image, with captation and label (not auto)
\newlength\imageheight
\newlength\imagewidth
\newcommand{\pic}[3]{%
\settoheight\imageheight{\includegraphics{pictures/#1.png}}%
\settowidth\imagewidth{\includegraphics{pictures/#1.png}}%
\ifthenelse{\lengthtest{\imagewidth > \textwidth}}{\ifthenelse{\lengthtest{\imageheight > \imagewidth}}{\par\vspace{0.95em}%
\begin{figure}
    \centering\includegraphics[height=0.85\textheight]{pictures/#1.png}
    \caption{#2}
    \label{#3}
\end{figure}%
\par\vspace{0.95em}}{\par\vspace{0.95em}%
\begin{figure}
    \centering\includegraphics[width=0.95\textwidth]{pictures/#1.png}
    \caption{#2}
    \label{#3}
\end{figure}%
\par\vspace{0.95em}}}{\ifthenelse{\lengthtest{\imageheight > \textheight}}{\par\vspace{0.95em}%
\begin{figure}
    \centering\includegraphics[height=0.85\textheight]{pictures/#1.png}
    \caption{#2}
    \label{#3}
\end{figure}%
\par\vspace{0.95em}}{\par\vspace{0.95em}%
\begin{figure}
    \centering\includegraphics{pictures/#1.png}
    \caption{#2}
    \label{#3}
\end{figure}%
\par\vspace{0.95em}}}}
%

要使用它:将您的 png 文件放在“图片”目录中,然后只需像这样调用图片:\pic{name_whitout_extension}{Captation_if_needed}{Label_if_needed}


编辑2:

感谢 Martin Scharrer 的easyfig软件包,我得到了一个大约 1.6 倍的解决方案,可以将我的照片居中,并具有完美的尺寸。

加拿大运输安全管理局:http://www.ctan.org/pkg/easyfig

风投:https://bitbucket.org/martin_scharrer/easyfig

版本 v1.2 – 2012/05/15


我希望这对其他人有用。

答案1

如果你想要的只是将图像的宽度限制为某个最大值(例如\linewidth),你可以简单地使用TeX 常见问题解答

\documentclass[a5paper]{article}
\usepackage{graphicx} 

\makeatletter
\def\maxwidth{%
  \ifdim\Gin@nat@width>\linewidth
    \linewidth
  \else
    \Gin@nat@width
  \fi
}
\makeatother

\begin{document}
\centering\includegraphics[width=\maxwidth]{largebottle}

\includegraphics[width=\maxwidth]{largesidebottle}
\end{document}

实际测量并输出尺寸,\settoheight应该\settowidth可以工作。您可以pt使用包将单位转换为其他单位printlen,正如 Werner 在评论中指出的那样。

ImageMagick ( identify -verbose bottle.jpg) 显示几何图形为 1408x714 像素,分辨率为每英寸 300x300 像素,即1408 px/300 px per in*72.27 pt per in=339.1872 pt714 px/300 px per in * 72.27 pt per in = 172.0026 pt

\documentclass[11pt ]{article}
\usepackage{graphicx} 
\usepackage{printlen}
\uselengthunit{cm}

\newlength\imageheight
\newlength\imagewidth

\begin{document}

\settoheight\imageheight{\includegraphics{bottle}}
\settowidth\imagewidth{\includegraphics{bottle}}
\includegraphics{bottle}

Height: \the\imageheight\ (\printlength{\imageheight})

Width: \the\imagewidth\ (\printlength{\imagewidth})

\end{document}

答案2

LaTeX 不使用像素。像素不是打印格式。pdflatex允许使用px单位,但这只是pt像 TeX 中的其他内容一样转换为点 ( )。像素与点的比率取决于图像密度以每英寸点数 (DPI) 为单位。默认情况下使用 72 DPI。TeX 点为 1/72.27 英寸,PostScript/PDF 点(bp以 TeX 为单位)为 1/72 英寸。如果您的图像具有较大的 DPI 值,但pdflatex无法从图像元数据中读取该值,则此转换可能是错误的(因为假定为 72 DPI),并且您的图像大小不正确。有时只需转换图像或打开并保存它即可修复元数据。


关于如何测量图像的所有尺寸:

不要多次包含图像来测量其不同尺寸。手动将其存储在一个框中(例如\mybox),然后您可以使用\ht\mybox(高度)、\wd\mybox(宽度)和\dp\mybox(深度)直接访问框尺寸。您提到的所有\setto...宏对临时框都执行完全相同的操作。

\newsavebox\mybox

\newcommand{\pic}[1]{%
   \sbox\mybox{\includegraphics{#1}}%
   Height: \the\ht\mybox
   Width: \the\wd\mybox
   Depth: \the\dp\mybox % For images usually 0 except if rotated 
   \ifdim\wd\mybox>.6\textwidth
     % width is larger than 60% of the text width ...
   \fi
   % Insert the image:
   \usebox\mybox
}

您还可能需要\@tempboxa盒子登记册(需要\makeatletter.. \makeatother)或直接盒子登记册号码0\sbox0{...} \ht0 ...

答案3

虽然问题询问如何在 LaTeX 中执行此操作,但我还添加了一个答案来展示如何使用 ConTeXt 中的高级界面来执行此操作。

每当您使用 时,ConTeXt 都会使用宏、和\externalfigure提供尺寸(以及 pdf 图像的页数)。如果您不想将图像包含在文档中,而只想测量其尺寸,请使用。以下示例获取远程托管图像的尺寸:\figurenaturalwidth\figurenaturalheight\noffigurepages\getfiguredimensions

\starttext
\getfiguredimensions[http://placekitten.com/500/300][method=png]
\startTABLE
  \NC Width  \NC \the\dimexpr\figurenaturalwidth  \NC \NR
  \NC Height \NC \the\dimexpr\figurenaturalheight \NC \NR
  \NC Pages  \NC \noffigurepages                  \NC \NR
\stopTABLE
\stoptext

\figurenaturalwidth...height返回 中的单位sp。我使用\the\dimexpr将结果转换为点。也可以使用 Lua 函数number.todimen(...) 来实现更通用的转换例程。

笔记与 LaTeX 一样,尺寸计算使用 pdftex/luatex 中指定的默认 DPI。因此,Jake 的比较评论px仍然pt有意义。

根据编辑的问题,您可以在 ConTeXt 中使用:

\externalfigure[figurename][maxwidth=\textwidth, maxheight=\textheight]

这将缩小图像,使其高度和宽度不超过maxheightmaxwidth。如果需要为许多图形设置这些选项,可以使用:

\defineexternalfigure[MaxWidthAndHeight][maxwidth=\textwidth, maxheight=\textheight]
\externalfigure[figurename][MaxWidthAndHeight][frame=on]

(我frame=on仅用来展示如何添加其他选项(如果需要))。

相关内容