最近我问了这个问题: 符号上方虚线左箭头
我需要知道如何在符号上放置虚线左箭头。我收到了两个答案,其中一个使用 Tikz 来实现这一点,另一个使用纯 LaTeX 解决方案。我在使用 Tikz 创建的箭头时遇到了问题,所以我使用了 LaTeX 解决方案。解决方案效果很好。
但是,现在我需要创建相同的箭头,但仅指向右侧。
我尝试(通过反复试验)修改用户 mapf 提供的代码。但由于我不太了解命令的含义,所以我得到了奇怪的结果。
我设法:1)从 MnSymbol 导入虚线右箭头符号(符号 \dashedrightarrow,96)2)定义命令 \dashedrightarrowtip
我未能:1)定义命令 \odrafill。
我尝试了不同的方法,但箭头没有对齐,并且破折号没有正确显示。
我添加了一张显示“测试”的图片。我在图片中添加了文字来描述我的期望。
以下是我使用的代码:
\documentclass[12pt,a4paper,draft]{article}
\pagestyle{plain}
\usepackage[estonian]{babel}
\usepackage[a4paper]{geometry}
\usepackage{hyphenat}
\usepackage{enumerate}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{amsfonts}
\usepackage{indentfirst}
\usepackage{amsthm}
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{verbatim}
\usepackage{color}
\usepackage{tikz}
% =============================================
%Import symbol "\dashedleftarrow" from font MnSymbol without importing the whole package
% =============================================
\DeclareFontFamily{U} {MnSymbolA}{}
\DeclareFontShape{U}{MnSymbolA}{m}{n}{
<-6> MnSymbolA5
<6-7> MnSymbolA6
<7-8> MnSymbolA7
<8-9> MnSymbolA8
<9-10> MnSymbolA9
<10-12> MnSymbolA10
<12-> MnSymbolA12}{}
\DeclareFontShape{U}{MnSymbolA}{b}{n}{
<-6> MnSymbolA-Bold5
<6-7> MnSymbolA-Bold6
<7-8> MnSymbolA-Bold7
<8-9> MnSymbolA-Bold8
<9-10> MnSymbolA-Bold9
<10-12> MnSymbolA-Bold10
<12-> MnSymbolA-Bold12}{}
\DeclareSymbolFont{MnSyA} {U} {MnSymbolA}{m}{n}
\DeclareMathSymbol{\dashedleftarrow}{\mathrel}{MnSyA}{98}
\DeclareMathSymbol{\dashedrightarrow}{\mathrel}{MnSyA}{96}
\def\Gg{{\mathbf{G}}}
\def\gc{{\mathbf{g}}}
\newcommand{\toright}[1]{\overrightarrow{#1}}
\newcommand{\toleft}[1]{\overleftarrow{#1}}
\newcommand{\torightleft}[1]{\toleft{\toright{#1}}}
\newcommand{\toprerightleft}[1]{\toleft{\topreright{#1}}}
\newcommand{\torightpreleft}[1]{\topreleft{\toright{#1}}}
\newcommand{\toprerightpreleft}[1]{\topreleft{\topreright{#1}}}
\newcommand{\toleftright}[1]{\toright{\toleft{#1}}}
\newcommand{\topreleftright}[1]{\toright{\topreleft{#1}}}
\newcommand{\toleftpreright}[1]{\topreright{\toleft{#1}}}
\newcommand{\topreleftpreright}[1]{\topreright{\topreleft{#1}}}
% =============================================
% How to make dashed left arrow over symbol:
% https://tex.stackexchange.com/questions/114501/dashed-left-arrow-over-symbol
% =============================================
\makeatletter
\newcommand{\topreleft}[1]{%
\vbox {\m@th\ialign{##\crcr
\odlafill \crcr
\noalign{\kern-\p@\nointerlineskip}
$\hfil\displaystyle{#1}\hfil$\crcr}}}
\newcommand{\topreright}[1]{%
\vbox {\m@th\ialign{##\crcr
\odrafill \crcr
\noalign{\kern-\p@\nointerlineskip}
$\hfil\displaystyle{#1}\hfil$\crcr}}}
%% fill with (short) minus signs
\def\odlafill{%
$\m@th\dashedleftarrowtip\mkern-5mu\cleaders\hbox{$\mkern4mu\shortbar\mkern-3mu$}\hfill\mkern-0.5mu$}
% $\m@th\mkern0mu\dashedleftarrowtip\cleaders\hbox{$\mkern4mu\shortbar\mkern-3mu$}\hfill$}
%% fill with find (short) minus signs
\def\odrafill{%
$\m@th\mkern-5mu\cleaders\hbox{$\mkern-3mu\shortbar\mkern4mu$}\hfill\mkern-0.5mu\dashedrightarrowtip$}
%Test 1
%$\m@th\mkern-0.5mu\cleaders\hbox{$\mkern4mu\shortbar\mkern-3mu$}\hfill\mkern-5mu\dashedrightarrowtip$}
%Test 2
%$\m@th\dashedrightarrowtip\mkern-5mu\cleaders\hbox{$\mkern4mu\shortbar\mkern-3mu$}\hfill\mkern-0.5mu$}
%Test 3
%$\m@th\mkern0mu\dashedrightarrowtip\cleaders\hbox{$\mkern4mu\shortbar\mkern-3mu$}\hfill$}
%% put 5pt space above and 1pt below the tip
\def\dashedleftarrowtip{%
\raisebox{\z@}[5pt][1pt]{$\mathord{\dashedleftarrow}$}}
%% put 5pt space above and 1pt below the tip
\def\dashedrightarrowtip{%
\raisebox{\z@}[5pt][1pt]{$\mathord{\dashedrightarrow}$}}
%% make the minus shorter to fit \dashedleftarrow
\def\shortbar{%
% \smash{\scalebox{1}[1.0]{$-$}}}
\smash{\scalebox{0.4}[1.0]{$-$}}}
\makeatother
% =============================================
\begin{document}
Arrow over G should fit nicely into the brackets:
$\left[\toleft{\Gg}\right] = \left[ \topreleft{\Gg} \right].$
Dashed right arrow and left arrow should be of the same length:
$\toprerightleft{\gc}$
Left and right arrow are misaligned:
$\toprerightpreleft{\gc}$
Just for comparison:
$\torightleft{[\gc]}$
Both dashed arrows should be of the same length and align:
$\topreright{\topreleft{\Gg}}$
\end{document}
答案1
好的,这远非完美,但从某种意义上说,您链接到的我的答案的路线并不完美。问题是这样的:当我们使用虚线箭头MnSymbol
作为可扩展虚线箭头的箭头尖端时,此符号定义虚线的长度以及虚线之间的间隙。如果您还希望可扩展虚线箭头具有与标准可扩展箭头之一完全相同的长度,例如\overrightarrow
,我们必须在某些地方妥协,因为(固定)虚线图案的整数倍并不总是匹配。所以我们会在某处有不均匀的空间。
\documentclass{article}
\usepackage{graphicx}
\DeclareFontFamily{U}{MnSymbolA}{}
\DeclareSymbolFont{MnSyA}{U}{MnSymbolA}{m}{n}
\DeclareFontShape{U}{MnSymbolA}{m}{n}{
<-6> MnSymbolA5
<6-7> MnSymbolA6
<7-8> MnSymbolA7
<8-9> MnSymbolA8
<9-10> MnSymbolA9
<10-12> MnSymbolA10
<12-> MnSymbolA12}{}
\DeclareMathSymbol{\dashedleftarrow}{\mathrel}{MnSyA}{98}
\DeclareMathSymbol{\dashedrightarrow}{\mathrel}{MnSyA}{96}
\def\Gg{{\mathbf{G}}}
\def\gc{{\mathbf{g}}}
\newcommand{\toright}[1]{\overrightarrow{#1}}
\newcommand{\toleft}[1]{\overleftarrow{#1}}
\newcommand{\torightleft}[1]{\toleft{\toright{#1}}}
\newcommand{\toprerightleft}[1]{\toleft{\topreright{#1}}}
\newcommand{\torightpreleft}[1]{\topreleft{\toright{#1}}}
\newcommand{\toprerightpreleft}[1]{\topreleft{\topreright{#1}}}
\newcommand{\toleftright}[1]{\toright{\toleft{#1}}}
\newcommand{\topreleftright}[1]{\toright{\topreleft{#1}}}
\newcommand{\toleftpreright}[1]{\topreright{\toleft{#1}}}
\newcommand{\topreleftpreright}[1]{\topreright{\topreleft{#1}}}
\makeatletter
\newcommand{\topreleft}[1]{%
\vbox {\m@th\ialign{##\crcr
\topreleftfill \crcr
\noalign{\kern-\p@\nointerlineskip}
$\hfil\displaystyle{#1}\hfil$\crcr}}}
\newcommand{\topreright}[1]{%
\vbox {\m@th\ialign{##\crcr
\toprerightfill \crcr
\noalign{\kern-\p@\nointerlineskip}
$\hfil\displaystyle{#1}\hfil$\crcr}}}
%% fill with (short) minus signs
\def\topreleftfill{%
$\m@th%
\dashedleftarrowtip%
\mkern-1mu%
\xleaders\hbox{$\mkern2mu\shortbar\mkern-1mu$}\hfill%
\mkern1mu%
\shortbar%
\mkern0.5mu%
$}
\def\toprerightfill{%
$\m@th%
\mkern.5mu%
\shortbar%
\mkern-1mu%
\xleaders\hbox{$\mkern2mu\shortbar\mkern-1mu$}\hfill%
\mkern1mu%
\dashedrightarrowtip%
$}
%% put 4.0pt space above and 0.0pt below the tip
\def\dashedleftarrowtip{%
\raisebox{\z@}[4.0pt][0.0pt]{$\mathord{\dashedleftarrow}$}}
\def\dashedrightarrowtip{%
\raisebox{\z@}[4.0pt][0.0pt]{$\mathord{\dashedrightarrow}$}}
%% make the minus shorter to fit \dashedleftarrow
\def\shortbar{%
\smash{\scalebox{0.4}[1.0]{$-$}}}
\makeatother
\begin{document}
Arrow over G should fit nicely into the brackets:
\[%
\left[\toleft{\Gg}\right] = \left[ \topreleft{\Gg} \right]
= \left[\toright{\Gg}\right] = \left[ \topreright{\Gg} \right].
\]
Dashed right arrow and left arrow should be of the same length and align:
\[%
\toprerightleft{\gc} = \topreleftright{\gc} = \torightpreleft{\gc} = \toleftpreright{\gc} = \toprerightpreleft{\gc} = \topreleftpreright{\gc} = \torightleft{\gc} = \torightleft{[\gc]}
\]
Left and right arrow should align and have the same length:
\[%
\toprerightpreleft{\gc} = \toprerightpreleft{\Gg}
\]
\bigskip
\[%
\topreright{\topreleft{x}} \quad \topreright{\topreleft{ab}} \quad \topreright{\topreleft{abc}} \quad \topreright{\topreleft{abcd}} \quad \topreright{\topreleft{abcde}}
\]
\[%
\topreleft{\topreright{x}} \quad \topreleft{\topreright{ab}} \quad \topreleft{\topreright{abc}} \quad \topreleft{\topreright{abcd}} \quad \topreleft{\topreright{abcde}}
\]
\end{document}
所以还有一些需要完善的地方。既然你想知道如何调整参数,下面是它的工作原理。垂直布局由箭头尖端决定。定义
\def\dashedleftarrowtip{%
\raisebox{\z@}[4.0pt][0.0pt]{$\mathord{\dashedleftarrow}$}}
表示箭头尖端下方没有空间(0.0pt),上方有 4.0pt。这样,您可以定位箭头并确定它们堆叠时的距离。这也会影响括号的大小\left[...\right]
,因为它们也包含箭头上方的空白。
水平模式由以下因素决定:
\def\topreleftfill{%
$\m@th%
\dashedleftarrowtip%
\mkern-1mu%
\xleaders\hbox{$\mkern2mu\shortbar\mkern-1mu$}\hfill%
\mkern1mu%
\shortbar%
\mkern0.5mu%
$}
这里,是长度为=1/18\mkern1mu
的水平字距调整空间。该命令使用模式填充尽可能多的空间 ( ) ,其中无法用另一个框填充的剩余空间均匀分布在重复框之前、之后和之间。1mu
\quad
\xleaders
\hfill
\hbox{$\mkern2mu\shortbar\mkern-1mu$}