检测投影机的长宽比

检测投影机的长宽比

我正在用 制作幻灯片beamer。目前我不确定演示中将使用的纵横比。我知道我可以使用 的类选项更改比例beamer

问题是,更改纵横比会改变文档尺寸,因此我必须调整演示文稿中的某些参数(图形高度)。我想为 4:3 和 16:9 比例设计演示文稿。

是否有可能

\ifratio{34}{do somthing}
\ifratio{169}{do ohters}

或者

\ifratio{34}{do this}{else this}

答案1

除页面尺寸外,该aspectratio选项未设置任何有用的标志。可以检查这些尺寸对,或者直接从选项列表中进行检查;以下是根据expl3后一种策略借助于定义的两个宏。

\documentclass[aspectratio=1610]{beamer}

\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\ifaspectratio}{mmm}
 {
  % Recover the option from those passed to the class
  \keys_set:nf { zunbeltz/beameroptions } { \use:c { [email protected] } }
  \str_if_eq:nVTF { #1 } \l_zunbeltz_aspectratio_tl { #2 } { #3 }
 }
\NewDocumentCommand{\xifaspectratio}{mO{}}
 {
  % Recover the option from those passed to the class
  \keys_set:nf { zunbeltz/beameroptions } { \use:c { [email protected] } }
  \str_case:Vnn \l_zunbeltz_aspectratio_tl { #1 } { #2 }
 }
% We need to define only one key, the other are treated as `unknown'
\keys_define:nn { zunbeltz/beameroptions }
 {
  aspectratio .tl_set:N = \l_zunbeltz_aspectratio_tl,
  aspectratio .initial:n = 43,
  unknown .code:n = {},
 }

% Generate the variants we need
\cs_generate_variant:Nn \keys_set:nn { nf }
\cs_generate_variant:Nn \str_if_eq:nnTF { nV }
\cs_generate_variant:Nn \str_case:nnn { V }
\ExplSyntaxOff

\begin{document}
\begin{frame}
\ifaspectratio{1610}{We're on 16:10}{We're not on 16:10}

\xifaspectratio{
  {169}{We're on 16:9}
  {43}{We're on 4:3}
}[None of the above]
\end{frame}
\end{document}

该宏\ifaspectratio接受三个参数:我们要测试的比例、真实文本和虚假文本。

\xifaspectratio更加灵活:它接受一个强制参数,即一串对的列表{<ratio>}{<text>}和一个“以上都不是”情况的可选参数。

在此处输入图片描述

通过添加,\keys_define:nn { zunbeltz/beameroptions }可以定义类似的宏来检查其他选项。

答案2

您可以ifthen按照以下方式使用包

\documentclass{beamer}
%\documentclass[aspectratio=169]{beamer}
\usepackage{ifthen}

\makeatletter
\newcommand{\prova}{Aspect ratio is 4:3 (default)}
\ifthenelse{%
  \lengthtest{\beamer@paperwidth=16cm}}% condition (16cm is the width of the frame with an aspect ratio = 16:9)
    {\renewcommand{\prova}{Aspect ratio is 16:9}}% do this if condition is true
    {}% do nothing elsewhere
\makeatother

\begin{document}

\begin{frame}
\prova
\end{frame}

\end{document}

您还可以添加其他类似的结构

\ifthenelse{%
  \lengthtest{\beamer@paperwidth=16cm}}% condition (16cm is the width of the frame with an aspect ratio = 16:9)
    {\renewcommand{\prova}{Aspect ratio is 16:9}}% do this if condition is true
    {}% do nothing elsewhere

添加其他“支持的”宽高比。但是,如果你想要创建更通用的东西(不仅适合你,也不仅仅适合 16:9 或 4:3 宽高比),你必须小心,因为不同的宽高比可以有相同的paperwidth或相同的paperheight。一个解决方案是将两个\ifthenelse一个放在另一个里面。

这是将不同纵横比的纸张尺寸定义到beamer.cls类文件中的方式

\DeclareOptionBeamer{aspectratio}[43]{%
  \ifnum#1=1610%
    \beamer@paperwidth 16.00cm%
    \beamer@paperheight 10.00cm%
  \else\ifnum#1=169%
    \beamer@paperwidth 16.00cm%
    \beamer@paperheight 9.00cm%
  \else\ifnum#1=149%
    \beamer@paperwidth 14.00cm%
    \beamer@paperheight 9.00cm%
  \else\ifnum#1=54%
    \beamer@paperwidth 12.50cm%
    \beamer@paperheight 10.00cm%
  \else\ifnum#1=43%
    \beamer@paperwidth 12.80cm%
    \beamer@paperheight 9.60cm%
  \else\ifnum#1=32%
    \beamer@paperwidth 13.50cm%
    \beamer@paperheight 9.00cm%
  \fi\fi\fi\fi\fi\fi%
}

答案3

我采纳了您的第二个建议,并创建了一个名为的命令,\ifratio其用法如下:

\ifratio{43}{code in case aspect ratio is 43}{code otherwise}

您可以同时使用纵横比选项;43但是169,因为我太懒了,所以不能使用其他选项,但您可以轻松扩展命令以处理更多情况。

不需要ifthenelse

在此处输入图片描述

%\documentclass{beamer}
\documentclass[aspectratio=169]{beamer}

\makeatletter
\newcommand\ifratio[3]{%
\ifnum#1=169%
    \ifdim\beamer@paperwidth=16.00cm\relax%
        \ifdim\beamer@paperheight=9.00cm\relax%
            #2%
        \else%
            #3%
        \fi%
    \else%
        #3%
    \fi%
\else%
    \ifnum#1=43%
        \ifdim\beamer@paperwidth=12.80cm\relax%
            \ifdim\beamer@paperheight=9.60cm\relax%
                #2%
            \else%
                #3%
            \fi%
        \else%
            #3%
        \fi%
    \fi%
\fi%
}
\makeatother

\begin{document}
    \begin{frame}
        \ifratio{169}{Code for 169}{Code for aspect ratio other than 169}
    \end{frame}
\end{document

答案4

随着当前 beamer 开发版本(应该包含在 beamer v3.70 或更新版本中),您可以使用\insertaspectratio宏来访问演示的纵横比:

\documentclass[
    aspectratio=169
%   aspectratio=43
]{beamer}

\begin{document}

\begin{frame}

\ifnum\insertaspectratio=169
  do something
\else
  something else
\fi
\end{frame}

\end{document}

相关内容