Sự cố với lệnh mới

Oct 28 2020

Vì tôi đang theo học một lớp đại số tuyến tính, tôi thường phải viết M (mxn, K) và tôi thấy điều đó thật phiền phức.

Tôi đã cố gắng xác định một lệnh: \newcommand{\M}[3]{M(#1 \times #2, #3)}nhưng điều này cho kết quả lạ:

Tôi có thể giải quyết vấn đề này không? Cảm ơn trước

Trả lời

9 egreg Oct 28 2020 at 16:04

Nếu bạn xác định

\newcommand{\M}[3]{M(#1 \times #2, #3)}

thì cú pháp đầu vào phải là

\M{2}{2}{\mathbb{R}}

và không

\M{2,2,\mathbb{R}}

mà thực sự tái tạo đầu ra lạ và, có thể, một số thông báo lỗi.

Thí dụ:

\documentclass{article}
\usepackage{amsmath,amssymb}

\newcommand{\RR}{\mathbb{R}} % the reals

\newcommand{\M}[3]{M(#1\times #2,#3)}

\begin{document}

Good syntax \verb|\M{2}{2}{\RR}| yields $A\in\M{2}{2}{\RR}$

Bad syntax \verb|\M{2,2,\RR}| yields $A\in\M{2,2,\RR}$

\end{document}

Bạn có thể nhận được cú pháp dễ dàng hơn để làm việc không? Đúng.

\documentclass{article}
\usepackage{amsmath,amssymb}
%\usepackage{xparse}% not needed for LaTeX 2020-10-01 or later

\newcommand{\RR}{\mathbb{R}} % the reals

\NewDocumentCommand{\M}{>{\SplitArgument{2}{,}}m}{\MLONG#1}
\NewDocumentCommand{\MLONG}{mmm}{M(#1\times #2,#3)}

\begin{document}

Good new syntax \verb|\M{2,2,\RR}| yields $A\in\M{2,2,\RR}$

\end{document}

Bí mật nằm ở đâu? Bộ tiền xử lý \SplitArgument{2}{,}yêu cầu LaTeX đọc đối số, đối số này phải chứa hai dấu phẩy và chuyển #1là

{<a>}{<b>}{<c>}

khi đối số là <a>,<b>,<c>. Vì vậy, chúng ta có thể cấp đối số đã chuyển đổi để \MLONGđọc ba đối số tiêu chuẩn.

3 Denis Oct 28 2020 at 15:52

Như Campa đã nói, bạn nên luôn cung cấp MWE

Hiện tại, hãy xem

\documentclass[12pt]{article}
    \usepackage[a4paper]{geometry}
    \usepackage{mathtools,amsfonts}
\newcommand{\M}[3]{\ensuremath{M(#1 \times #2, #3)}}
\begin{document}
\M{1}{2}{\mathbb{R}}
\end{document} 

cho

như mong đợi.

NickMatteo Oct 29 2020 at 08:33

Như các câu trả lời khác đã xác định, vấn đề là bạn cần viết \M{2}{2}{R}để sử dụng macro của mình trong tài liệu.

Có thể hiểu rằng bạn muốn tránh viết nó theo cách đó, vì dấu ngoặc nhọn rất khó nhập. egreg đã chỉ ra một cách để giảm (nhưng không loại bỏ) dấu ngoặc nhọn bằng LaTeX hiện đại.

Nếu bạn muốn sử dụng cú pháp tương tự như cách bạn đã viết nó trong văn bản câu hỏi của mình, một cách tiếp cận khác là định nghĩa kiểu TeX cũ

\def\M(#1x#2,#3){M(#1 \times #2, \mathbb{#3})}

Sau đó, bạn có thể viết \M(2x2,R)trong tài liệu của mình.